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

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

Issue 2871573011: [DevTools] Respond with a close frame (Closed)
Patch Set: [DevTools] Respond with a close frame 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 18 matching lines...) Expand all
54 Read(buffer); 55 Read(buffer);
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 SendData(encoded_frame);
65 if (request_buffer_.length() == encoded_frame.length())
66 SendPendingRequests(0);
67 } 66 }
68 67
69 private: 68 private:
70 void Read(scoped_refptr<net::IOBuffer> io_buffer) { 69 void Read(scoped_refptr<net::IOBuffer> io_buffer) {
71 int result = socket_->Read( 70 int result = socket_->Read(
72 io_buffer.get(), 71 io_buffer.get(),
73 kBufferSize, 72 kBufferSize,
74 base::Bind(&WebSocketImpl::OnBytesRead, 73 base::Bind(&WebSocketImpl::OnBytesRead,
75 base::Unretained(this), io_buffer)); 74 base::Unretained(this), io_buffer));
76 if (result != net::ERR_IO_PENDING) 75 if (result != net::ERR_IO_PENDING)
(...skipping 18 matching lines...) Expand all
95 response_buffer_, &bytes_consumed, &output); 94 response_buffer_, &bytes_consumed, &output);
96 95
97 while (parse_result == WebSocket::FRAME_OK) { 96 while (parse_result == WebSocket::FRAME_OK) {
98 response_buffer_ = response_buffer_.substr(bytes_consumed); 97 response_buffer_ = response_buffer_.substr(bytes_consumed);
99 response_task_runner_->PostTask( 98 response_task_runner_->PostTask(
100 FROM_HERE, 99 FROM_HERE,
101 base::BindOnce(&AndroidWebSocket::OnFrameRead, weak_socket_, output)); 100 base::BindOnce(&AndroidWebSocket::OnFrameRead, weak_socket_, output));
102 parse_result = encoder_->DecodeFrame( 101 parse_result = encoder_->DecodeFrame(
103 response_buffer_, &bytes_consumed, &output); 102 response_buffer_, &bytes_consumed, &output);
104 } 103 }
104 if (parse_result == WebSocket::FRAME_CLOSE)
105 SendData(kCloseResponse);
105 106
106 if (parse_result == WebSocket::FRAME_ERROR || 107 if (parse_result == WebSocket::FRAME_ERROR) {
107 parse_result == WebSocket::FRAME_CLOSE) {
108 Disconnect(); 108 Disconnect();
109 return; 109 return;
110 } 110 }
111 Read(io_buffer); 111 Read(io_buffer);
112 } 112 }
113 113
114 void SendData(const std::string& data) {
115 request_buffer_ += data;
116 if (request_buffer_.length() == data.length())
117 SendPendingRequests(0);
118 }
119
114 void SendPendingRequests(int result) { 120 void SendPendingRequests(int result) {
115 DCHECK(thread_checker_.CalledOnValidThread()); 121 DCHECK(thread_checker_.CalledOnValidThread());
116 if (result < 0) { 122 if (result < 0) {
117 Disconnect(); 123 Disconnect();
118 return; 124 return;
119 } 125 }
120 request_buffer_ = request_buffer_.substr(result); 126 request_buffer_ = request_buffer_.substr(result);
121 if (request_buffer_.empty()) 127 if (request_buffer_.empty())
122 return; 128 return;
123 129
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
211 delegate_->OnSocketClosed(); 217 delegate_->OnSocketClosed();
212 } 218 }
213 219
214 AndroidDeviceManager::AndroidWebSocket* 220 AndroidDeviceManager::AndroidWebSocket*
215 AndroidDeviceManager::Device::CreateWebSocket( 221 AndroidDeviceManager::Device::CreateWebSocket(
216 const std::string& socket_name, 222 const std::string& socket_name,
217 const std::string& path, 223 const std::string& path,
218 AndroidWebSocket::Delegate* delegate) { 224 AndroidWebSocket::Delegate* delegate) {
219 return new AndroidWebSocket(this, socket_name, path, delegate); 225 return new AndroidWebSocket(this, socket_name, path, delegate);
220 } 226 }
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