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

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

Issue 1078733002: Android device manager should not drop WebSocket frame data even if it arrives together with handsh… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 5 years, 8 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 | « chrome/browser/devtools/device/android_device_manager.cc ('k') | 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 "base/memory/weak_ptr.h" 5 #include "base/memory/weak_ptr.h"
6 #include "base/message_loop/message_loop.h" 6 #include "base/message_loop/message_loop.h"
7 #include "base/rand_util.h" 7 #include "base/rand_util.h"
8 #include "chrome/browser/devtools/device/android_device_manager.h" 8 #include "chrome/browser/devtools/device/android_device_manager.h"
9 #include "content/public/browser/browser_thread.h" 9 #include "content/public/browser/browser_thread.h"
10 #include "net/base/io_buffer.h" 10 #include "net/base/io_buffer.h"
11 #include "net/base/net_errors.h" 11 #include "net/base/net_errors.h"
12 #include "net/server/web_socket_encoder.h" 12 #include "net/server/web_socket_encoder.h"
13 #include "net/socket/stream_socket.h" 13 #include "net/socket/stream_socket.h"
14 14
15 using content::BrowserThread; 15 using content::BrowserThread;
16 using net::WebSocket; 16 using net::WebSocket;
17 17
18 namespace { 18 namespace {
19 19
20 const int kBufferSize = 16 * 1024; 20 const int kBufferSize = 16 * 1024;
21 21
22 } // namespace 22 } // namespace
23 23
24 class AndroidDeviceManager::AndroidWebSocket::WebSocketImpl { 24 class AndroidDeviceManager::AndroidWebSocket::WebSocketImpl {
25 public: 25 public:
26 WebSocketImpl(scoped_refptr<base::MessageLoopProxy> response_message_loop, 26 WebSocketImpl(scoped_refptr<base::MessageLoopProxy> response_message_loop,
27 base::WeakPtr<AndroidWebSocket> weak_socket, 27 base::WeakPtr<AndroidWebSocket> weak_socket,
28 const std::string& extensions, 28 const std::string& extensions,
29 const std::string& body_head,
29 scoped_ptr<net::StreamSocket> socket) 30 scoped_ptr<net::StreamSocket> socket)
30 : response_message_loop_(response_message_loop), 31 : response_message_loop_(response_message_loop),
31 weak_socket_(weak_socket), 32 weak_socket_(weak_socket),
32 socket_(socket.Pass()), 33 socket_(socket.Pass()),
33 encoder_(net::WebSocketEncoder::CreateClient(extensions)) { 34 encoder_(net::WebSocketEncoder::CreateClient(extensions)),
35 response_buffer_(body_head) {
34 thread_checker_.DetachFromThread(); 36 thread_checker_.DetachFromThread();
35 } 37 }
36 38
37 void StartListening() { 39 void StartListening() {
38 DCHECK(thread_checker_.CalledOnValidThread()); 40 DCHECK(thread_checker_.CalledOnValidThread());
39 DCHECK(socket_); 41 DCHECK(socket_);
42
40 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize)); 43 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize));
41 Read(buffer); 44
45 if (response_buffer_.size() > 0)
46 ProcessResponseBuffer(buffer);
47 else
48 Read(buffer);
42 } 49 }
43 50
44 void SendFrame(const std::string& message) { 51 void SendFrame(const std::string& message) {
45 DCHECK(thread_checker_.CalledOnValidThread()); 52 DCHECK(thread_checker_.CalledOnValidThread());
46 if (!socket_) 53 if (!socket_)
47 return; 54 return;
48 int mask = base::RandInt(0, 0x7FFFFFFF); 55 int mask = base::RandInt(0, 0x7FFFFFFF);
49 std::string encoded_frame; 56 std::string encoded_frame;
50 encoder_->EncodeFrame(message, mask, &encoded_frame); 57 encoder_->EncodeFrame(message, mask, &encoded_frame);
51 request_buffer_ += encoded_frame; 58 request_buffer_ += encoded_frame;
52 if (request_buffer_.length() == encoded_frame.length()) 59 if (request_buffer_.length() == encoded_frame.length())
53 SendPendingRequests(0); 60 SendPendingRequests(0);
54 } 61 }
55 62
56 private: 63 private:
57 void Read(scoped_refptr<net::IOBuffer> response_buffer) { 64 void Read(scoped_refptr<net::IOBuffer> io_buffer) {
58 int result = socket_->Read( 65 int result = socket_->Read(
59 response_buffer.get(), 66 io_buffer.get(),
60 kBufferSize, 67 kBufferSize,
61 base::Bind(&WebSocketImpl::OnBytesRead, 68 base::Bind(&WebSocketImpl::OnBytesRead,
62 base::Unretained(this), response_buffer)); 69 base::Unretained(this), io_buffer));
63 if (result != net::ERR_IO_PENDING) 70 if (result != net::ERR_IO_PENDING)
64 OnBytesRead(response_buffer, result); 71 OnBytesRead(io_buffer, result);
65 } 72 }
66 73
67 void OnBytesRead(scoped_refptr<net::IOBuffer> response_buffer, int result) { 74 void OnBytesRead(scoped_refptr<net::IOBuffer> io_buffer, int result) {
68 DCHECK(thread_checker_.CalledOnValidThread()); 75 DCHECK(thread_checker_.CalledOnValidThread());
69 if (result <= 0) { 76 if (result <= 0) {
70 Disconnect(); 77 Disconnect();
71 return; 78 return;
72 } 79 }
73 response_buffer_.append(response_buffer->data(), result); 80 response_buffer_.append(io_buffer->data(), result);
74 81
82 ProcessResponseBuffer(io_buffer);
83 }
84
85 void ProcessResponseBuffer(scoped_refptr<net::IOBuffer> io_buffer) {
75 int bytes_consumed; 86 int bytes_consumed;
76 std::string output; 87 std::string output;
77 WebSocket::ParseResult parse_result = encoder_->DecodeFrame( 88 WebSocket::ParseResult parse_result = encoder_->DecodeFrame(
78 response_buffer_, &bytes_consumed, &output); 89 response_buffer_, &bytes_consumed, &output);
79 90
80 while (parse_result == WebSocket::FRAME_OK) { 91 while (parse_result == WebSocket::FRAME_OK) {
81 response_buffer_ = response_buffer_.substr(bytes_consumed); 92 response_buffer_ = response_buffer_.substr(bytes_consumed);
82 response_message_loop_->PostTask( 93 response_message_loop_->PostTask(
83 FROM_HERE, 94 FROM_HERE,
84 base::Bind(&AndroidWebSocket::OnFrameRead, weak_socket_, output)); 95 base::Bind(&AndroidWebSocket::OnFrameRead, weak_socket_, output));
85 parse_result = encoder_->DecodeFrame( 96 parse_result = encoder_->DecodeFrame(
86 response_buffer_, &bytes_consumed, &output); 97 response_buffer_, &bytes_consumed, &output);
87 } 98 }
88 99
89 if (parse_result == WebSocket::FRAME_ERROR || 100 if (parse_result == WebSocket::FRAME_ERROR ||
90 parse_result == WebSocket::FRAME_CLOSE) { 101 parse_result == WebSocket::FRAME_CLOSE) {
91 Disconnect(); 102 Disconnect();
92 return; 103 return;
93 } 104 }
94 Read(response_buffer); 105 Read(io_buffer);
95 } 106 }
96 107
97 void SendPendingRequests(int result) { 108 void SendPendingRequests(int result) {
98 DCHECK(thread_checker_.CalledOnValidThread()); 109 DCHECK(thread_checker_.CalledOnValidThread());
99 if (result < 0) { 110 if (result < 0) {
100 Disconnect(); 111 Disconnect();
101 return; 112 return;
102 } 113 }
103 request_buffer_ = request_buffer_.substr(result); 114 request_buffer_ = request_buffer_.substr(result);
104 if (request_buffer_.empty()) 115 if (request_buffer_.empty())
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 DCHECK(device_); 172 DCHECK(device_);
162 device_->message_loop_proxy_->PostTask( 173 device_->message_loop_proxy_->PostTask(
163 FROM_HERE, 174 FROM_HERE,
164 base::Bind(&WebSocketImpl::SendFrame, 175 base::Bind(&WebSocketImpl::SendFrame,
165 base::Unretained(socket_impl_), message)); 176 base::Unretained(socket_impl_), message));
166 } 177 }
167 178
168 void AndroidDeviceManager::AndroidWebSocket::Connected( 179 void AndroidDeviceManager::AndroidWebSocket::Connected(
169 int result, 180 int result,
170 const std::string& extensions, 181 const std::string& extensions,
182 const std::string& body_head,
171 scoped_ptr<net::StreamSocket> socket) { 183 scoped_ptr<net::StreamSocket> socket) {
172 DCHECK_CURRENTLY_ON(BrowserThread::UI); 184 DCHECK_CURRENTLY_ON(BrowserThread::UI);
173 if (result != net::OK || !socket.get()) { 185 if (result != net::OK || !socket.get()) {
174 OnSocketClosed(); 186 OnSocketClosed();
175 return; 187 return;
176 } 188 }
177 socket_impl_ = new WebSocketImpl(base::MessageLoopProxy::current(), 189 socket_impl_ = new WebSocketImpl(base::MessageLoopProxy::current(),
178 weak_factory_.GetWeakPtr(), 190 weak_factory_.GetWeakPtr(),
179 extensions, 191 extensions,
192 body_head,
180 socket.Pass()); 193 socket.Pass());
181 device_->message_loop_proxy_->PostTask( 194 device_->message_loop_proxy_->PostTask(
182 FROM_HERE, 195 FROM_HERE,
183 base::Bind(&WebSocketImpl::StartListening, 196 base::Bind(&WebSocketImpl::StartListening,
184 base::Unretained(socket_impl_))); 197 base::Unretained(socket_impl_)));
185 delegate_->OnSocketOpened(); 198 delegate_->OnSocketOpened();
186 } 199 }
187 200
188 void AndroidDeviceManager::AndroidWebSocket::OnFrameRead( 201 void AndroidDeviceManager::AndroidWebSocket::OnFrameRead(
189 const std::string& message) { 202 const std::string& message) {
(...skipping 20 matching lines...) Expand all
210 } 223 }
211 } 224 }
212 225
213 AndroidDeviceManager::AndroidWebSocket* 226 AndroidDeviceManager::AndroidWebSocket*
214 AndroidDeviceManager::Device::CreateWebSocket( 227 AndroidDeviceManager::Device::CreateWebSocket(
215 const std::string& socket_name, 228 const std::string& socket_name,
216 const std::string& url, 229 const std::string& url,
217 AndroidWebSocket::Delegate* delegate) { 230 AndroidWebSocket::Delegate* delegate) {
218 return new AndroidWebSocket(this, socket_name, url, delegate); 231 return new AndroidWebSocket(this, socket_name, url, delegate);
219 } 232 }
OLDNEW
« no previous file with comments | « chrome/browser/devtools/device/android_device_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698