Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(431)

Side by Side Diff: chrome/browser/devtools/device/android_web_socket.cc

Issue 2871573011: [DevTools] Respond with a close frame (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <utility> 5 #include <utility>
6 6
7 #include "base/location.h" 7 #include "base/location.h"
8 #include "base/macros.h" 8 #include "base/macros.h"
9 #include "base/memory/weak_ptr.h" 9 #include "base/memory/weak_ptr.h"
10 #include "base/rand_util.h" 10 #include "base/rand_util.h"
11 #include "base/single_thread_task_runner.h" 11 #include "base/single_thread_task_runner.h"
12 #include "base/threading/thread_task_runner_handle.h" 12 #include "base/threading/thread_task_runner_handle.h"
13 #include "chrome/browser/devtools/device/android_device_manager.h" 13 #include "chrome/browser/devtools/device/android_device_manager.h"
14 #include "content/public/browser/browser_thread.h" 14 #include "content/public/browser/browser_thread.h"
15 #include "net/base/io_buffer.h" 15 #include "net/base/io_buffer.h"
16 #include "net/base/net_errors.h" 16 #include "net/base/net_errors.h"
17 #include "net/server/web_socket_encoder.h" 17 #include "net/server/web_socket_encoder.h"
18 #include "net/socket/stream_socket.h" 18 #include "net/socket/stream_socket.h"
19 19
20 using content::BrowserThread; 20 using content::BrowserThread;
21 using net::WebSocket; 21 using net::WebSocket;
22 22
23 namespace { 23 namespace {
24 24
25 const int kBufferSize = 16 * 1024; 25 const int kBufferSize = 16 * 1024;
26 const char kCloseResponse[] = "\x88\x80\x2D\x0E\x1E\xFA";
26 27
27 } // namespace 28 } // namespace
28 29
29 class AndroidDeviceManager::AndroidWebSocket::WebSocketImpl { 30 class AndroidDeviceManager::AndroidWebSocket::WebSocketImpl {
30 public: 31 public:
31 WebSocketImpl( 32 WebSocketImpl(
32 scoped_refptr<base::SingleThreadTaskRunner> response_task_runner, 33 scoped_refptr<base::SingleThreadTaskRunner> response_task_runner,
33 base::WeakPtr<AndroidWebSocket> weak_socket, 34 base::WeakPtr<AndroidWebSocket> weak_socket,
34 const std::string& extensions, 35 const std::string& extensions,
35 const std::string& body_head, 36 const std::string& body_head,
(...skipping 19 matching lines...) Expand all
55 } 56 }
56 57
57 void SendFrame(const std::string& message) { 58 void SendFrame(const std::string& message) {
58 DCHECK(thread_checker_.CalledOnValidThread()); 59 DCHECK(thread_checker_.CalledOnValidThread());
59 if (!socket_) 60 if (!socket_)
60 return; 61 return;
61 int mask = base::RandInt(0, 0x7FFFFFFF); 62 int mask = base::RandInt(0, 0x7FFFFFFF);
62 std::string encoded_frame; 63 std::string encoded_frame;
63 encoder_->EncodeFrame(message, mask, &encoded_frame); 64 encoder_->EncodeFrame(message, mask, &encoded_frame);
64 request_buffer_ += encoded_frame; 65 request_buffer_ += encoded_frame;
65 if (request_buffer_.length() == encoded_frame.length()) 66 if (request_buffer_.length() == encoded_frame.length())
dgozman 2017/05/09 23:00:38 Let's add SendData(const std::string& data) which
eostroukhov 2017/05/09 23:53:14 Done.
66 SendPendingRequests(0); 67 SendPendingRequests(0);
67 } 68 }
68 69
69 private: 70 private:
70 void Read(scoped_refptr<net::IOBuffer> io_buffer) { 71 void Read(scoped_refptr<net::IOBuffer> io_buffer) {
71 int result = socket_->Read( 72 int result = socket_->Read(
72 io_buffer.get(), 73 io_buffer.get(),
73 kBufferSize, 74 kBufferSize,
74 base::Bind(&WebSocketImpl::OnBytesRead, 75 base::Bind(&WebSocketImpl::OnBytesRead,
75 base::Unretained(this), io_buffer)); 76 base::Unretained(this), io_buffer));
(...skipping 19 matching lines...) Expand all
95 response_buffer_, &bytes_consumed, &output); 96 response_buffer_, &bytes_consumed, &output);
96 97
97 while (parse_result == WebSocket::FRAME_OK) { 98 while (parse_result == WebSocket::FRAME_OK) {
98 response_buffer_ = response_buffer_.substr(bytes_consumed); 99 response_buffer_ = response_buffer_.substr(bytes_consumed);
99 response_task_runner_->PostTask( 100 response_task_runner_->PostTask(
100 FROM_HERE, 101 FROM_HERE,
101 base::BindOnce(&AndroidWebSocket::OnFrameRead, weak_socket_, output)); 102 base::BindOnce(&AndroidWebSocket::OnFrameRead, weak_socket_, output));
102 parse_result = encoder_->DecodeFrame( 103 parse_result = encoder_->DecodeFrame(
103 response_buffer_, &bytes_consumed, &output); 104 response_buffer_, &bytes_consumed, &output);
104 } 105 }
106 if (parse_result == WebSocket::FRAME_CLOSE)
107 SendCloseResponse();
105 108
106 if (parse_result == WebSocket::FRAME_ERROR || 109 if (parse_result == WebSocket::FRAME_ERROR) {
107 parse_result == WebSocket::FRAME_CLOSE) {
108 Disconnect(); 110 Disconnect();
109 return; 111 return;
110 } 112 }
111 Read(io_buffer); 113 Read(io_buffer);
112 } 114 }
113 115
116 void SendCloseResponse() {
117 request_buffer_ += kCloseResponse;
118 if (request_buffer_.length() == arraysize(kCloseResponse) - 1)
119 SendPendingRequests(0);
120 }
121
114 void SendPendingRequests(int result) { 122 void SendPendingRequests(int result) {
115 DCHECK(thread_checker_.CalledOnValidThread()); 123 DCHECK(thread_checker_.CalledOnValidThread());
116 if (result < 0) { 124 if (result < 0) {
117 Disconnect(); 125 Disconnect();
118 return; 126 return;
119 } 127 }
120 request_buffer_ = request_buffer_.substr(result); 128 request_buffer_ = request_buffer_.substr(result);
121 if (request_buffer_.empty()) 129 if (request_buffer_.empty())
122 return; 130 return;
123 131
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
211 delegate_->OnSocketClosed(); 219 delegate_->OnSocketClosed();
212 } 220 }
213 221
214 AndroidDeviceManager::AndroidWebSocket* 222 AndroidDeviceManager::AndroidWebSocket*
215 AndroidDeviceManager::Device::CreateWebSocket( 223 AndroidDeviceManager::Device::CreateWebSocket(
216 const std::string& socket_name, 224 const std::string& socket_name,
217 const std::string& path, 225 const std::string& path,
218 AndroidWebSocket::Delegate* delegate) { 226 AndroidWebSocket::Delegate* delegate) {
219 return new AndroidWebSocket(this, socket_name, path, delegate); 227 return new AndroidWebSocket(this, socket_name, path, delegate);
220 } 228 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698