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

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: Merged horo's CL 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
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> response_io_buffer) {
58 int result = socket_->Read( 65 int result = socket_->Read(
59 response_buffer.get(), 66 response_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), response_io_buffer));
63 if (result != net::ERR_IO_PENDING) 70 if (result != net::ERR_IO_PENDING)
64 OnBytesRead(response_buffer, result); 71 OnBytesRead(response_io_buffer, result);
65 } 72 }
66 73
67 void OnBytesRead(scoped_refptr<net::IOBuffer> response_buffer, int result) { 74 void ProcessResponseBuffer(scoped_refptr<net::IOBuffer> response_io_buffer) {
dgozman 2015/04/09 14:05:22 I'd rename this to |io_buffer| to better different
tyoshino (SeeGerritForStatus) 2015/04/14 12:24:33 Done.
68 DCHECK(thread_checker_.CalledOnValidThread());
69 if (result <= 0) {
70 Disconnect();
71 return;
72 }
73 response_buffer_.append(response_buffer->data(), result);
74
75 int bytes_consumed; 75 int bytes_consumed;
76 std::string output; 76 std::string output;
77 WebSocket::ParseResult parse_result = encoder_->DecodeFrame( 77 WebSocket::ParseResult parse_result = encoder_->DecodeFrame(
78 response_buffer_, &bytes_consumed, &output); 78 response_buffer_, &bytes_consumed, &output);
79 79
80 while (parse_result == WebSocket::FRAME_OK) { 80 while (parse_result == WebSocket::FRAME_OK) {
81 response_buffer_ = response_buffer_.substr(bytes_consumed); 81 response_buffer_ = response_buffer_.substr(bytes_consumed);
82 response_message_loop_->PostTask( 82 response_message_loop_->PostTask(
83 FROM_HERE, 83 FROM_HERE,
84 base::Bind(&AndroidWebSocket::OnFrameRead, weak_socket_, output)); 84 base::Bind(&AndroidWebSocket::OnFrameRead, weak_socket_, output));
85 parse_result = encoder_->DecodeFrame( 85 parse_result = encoder_->DecodeFrame(
86 response_buffer_, &bytes_consumed, &output); 86 response_buffer_, &bytes_consumed, &output);
87 } 87 }
88 88
89 if (parse_result == WebSocket::FRAME_ERROR || 89 if (parse_result == WebSocket::FRAME_ERROR ||
90 parse_result == WebSocket::FRAME_CLOSE) { 90 parse_result == WebSocket::FRAME_CLOSE) {
91 Disconnect(); 91 Disconnect();
92 return; 92 return;
93 } 93 }
94 Read(response_buffer); 94 Read(response_io_buffer);
95 }
96
97 void OnBytesRead(scoped_refptr<net::IOBuffer> response_io_buffer,
dgozman 2015/04/09 14:05:22 nit: mind moving this code back for cleaner diff?
tyoshino (SeeGerritForStatus) 2015/04/14 12:24:33 Done.
98 int result) {
99 DCHECK(thread_checker_.CalledOnValidThread());
100 if (result <= 0) {
101 Disconnect();
102 return;
103 }
104 response_buffer_.append(response_io_buffer->data(), result);
105
106 ProcessResponseBuffer(response_io_buffer);
95 } 107 }
96 108
97 void SendPendingRequests(int result) { 109 void SendPendingRequests(int result) {
98 DCHECK(thread_checker_.CalledOnValidThread()); 110 DCHECK(thread_checker_.CalledOnValidThread());
99 if (result < 0) { 111 if (result < 0) {
100 Disconnect(); 112 Disconnect();
101 return; 113 return;
102 } 114 }
103 request_buffer_ = request_buffer_.substr(result); 115 request_buffer_ = request_buffer_.substr(result);
104 if (request_buffer_.empty()) 116 if (request_buffer_.empty())
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 DCHECK(device_); 173 DCHECK(device_);
162 device_->message_loop_proxy_->PostTask( 174 device_->message_loop_proxy_->PostTask(
163 FROM_HERE, 175 FROM_HERE,
164 base::Bind(&WebSocketImpl::SendFrame, 176 base::Bind(&WebSocketImpl::SendFrame,
165 base::Unretained(socket_impl_), message)); 177 base::Unretained(socket_impl_), message));
166 } 178 }
167 179
168 void AndroidDeviceManager::AndroidWebSocket::Connected( 180 void AndroidDeviceManager::AndroidWebSocket::Connected(
169 int result, 181 int result,
170 const std::string& extensions, 182 const std::string& extensions,
183 const std::string& body_head,
171 scoped_ptr<net::StreamSocket> socket) { 184 scoped_ptr<net::StreamSocket> socket) {
172 DCHECK_CURRENTLY_ON(BrowserThread::UI); 185 DCHECK_CURRENTLY_ON(BrowserThread::UI);
173 if (result != net::OK || !socket.get()) { 186 if (result != net::OK || !socket.get()) {
174 OnSocketClosed(); 187 OnSocketClosed();
175 return; 188 return;
176 } 189 }
177 socket_impl_ = new WebSocketImpl(base::MessageLoopProxy::current(), 190 socket_impl_ = new WebSocketImpl(base::MessageLoopProxy::current(),
178 weak_factory_.GetWeakPtr(), 191 weak_factory_.GetWeakPtr(),
179 extensions, 192 extensions,
193 body_head,
180 socket.Pass()); 194 socket.Pass());
181 device_->message_loop_proxy_->PostTask( 195 device_->message_loop_proxy_->PostTask(
182 FROM_HERE, 196 FROM_HERE,
183 base::Bind(&WebSocketImpl::StartListening, 197 base::Bind(&WebSocketImpl::StartListening,
184 base::Unretained(socket_impl_))); 198 base::Unretained(socket_impl_)));
185 delegate_->OnSocketOpened(); 199 delegate_->OnSocketOpened();
186 } 200 }
187 201
188 void AndroidDeviceManager::AndroidWebSocket::OnFrameRead( 202 void AndroidDeviceManager::AndroidWebSocket::OnFrameRead(
189 const std::string& message) { 203 const std::string& message) {
(...skipping 20 matching lines...) Expand all
210 } 224 }
211 } 225 }
212 226
213 AndroidDeviceManager::AndroidWebSocket* 227 AndroidDeviceManager::AndroidWebSocket*
214 AndroidDeviceManager::Device::CreateWebSocket( 228 AndroidDeviceManager::Device::CreateWebSocket(
215 const std::string& socket_name, 229 const std::string& socket_name,
216 const std::string& url, 230 const std::string& url,
217 AndroidWebSocket::Delegate* delegate) { 231 AndroidWebSocket::Delegate* delegate) {
218 return new AndroidWebSocket(this, socket_name, url, delegate); 232 return new AndroidWebSocket(this, socket_name, url, delegate);
219 } 233 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698