Commit 13fbeece authored by dgozman's avatar dgozman Committed by Commit bot

[DevTools] Support permessage-deflate in AndroidWebSocket.

BUG=438230

Review URL: https://codereview.chromium.org/747903006

Cr-Commit-Position: refs/heads/master@{#308428}
parent 7254696a
...@@ -28,6 +28,7 @@ static const char kWebSocketUpgradeRequest[] = "GET %s HTTP/1.1\r\n" ...@@ -28,6 +28,7 @@ static const char kWebSocketUpgradeRequest[] = "GET %s HTTP/1.1\r\n"
"Connection: Upgrade\r\n" "Connection: Upgrade\r\n"
"Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n" "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
"Sec-WebSocket-Version: 13\r\n" "Sec-WebSocket-Version: 13\r\n"
"%s"
"\r\n"; "\r\n";
static void PostDeviceInfoCallback( static void PostDeviceInfoCallback(
...@@ -46,19 +47,21 @@ static void PostCommandCallback( ...@@ -46,19 +47,21 @@ static void PostCommandCallback(
base::Bind(callback, result, response)); base::Bind(callback, result, response));
} }
static void PostSocketCallback( static void PostHttpUpgradeCallback(
scoped_refptr<base::MessageLoopProxy> response_message_loop, scoped_refptr<base::MessageLoopProxy> response_message_loop,
const AndroidDeviceManager::SocketCallback& callback, const AndroidDeviceManager::HttpUpgradeCallback& callback,
int result, int result,
const std::string& extensions,
scoped_ptr<net::StreamSocket> socket) { scoped_ptr<net::StreamSocket> socket) {
response_message_loop->PostTask( response_message_loop->PostTask(
FROM_HERE, base::Bind(callback, result, base::Passed(&socket))); FROM_HERE,
base::Bind(callback, result, extensions, base::Passed(&socket)));
} }
class HttpRequest { class HttpRequest {
public: public:
typedef AndroidDeviceManager::CommandCallback CommandCallback; typedef AndroidDeviceManager::CommandCallback CommandCallback;
typedef AndroidDeviceManager::SocketCallback SocketCallback; typedef AndroidDeviceManager::HttpUpgradeCallback HttpUpgradeCallback;
static void CommandRequest(const std::string& request, static void CommandRequest(const std::string& request,
const CommandCallback& callback, const CommandCallback& callback,
...@@ -71,12 +74,12 @@ class HttpRequest { ...@@ -71,12 +74,12 @@ class HttpRequest {
new HttpRequest(socket.Pass(), request, callback); new HttpRequest(socket.Pass(), request, callback);
} }
static void SocketRequest(const std::string& request, static void HttpUpgradeRequest(const std::string& request,
const SocketCallback& callback, const HttpUpgradeCallback& callback,
int result, int result,
scoped_ptr<net::StreamSocket> socket) { scoped_ptr<net::StreamSocket> socket) {
if (result != net::OK) { if (result != net::OK) {
callback.Run(result, make_scoped_ptr<net::StreamSocket>(NULL)); callback.Run(result, "", make_scoped_ptr<net::StreamSocket>(nullptr));
return; return;
} }
new HttpRequest(socket.Pass(), request, callback); new HttpRequest(socket.Pass(), request, callback);
...@@ -94,9 +97,9 @@ class HttpRequest { ...@@ -94,9 +97,9 @@ class HttpRequest {
HttpRequest(scoped_ptr<net::StreamSocket> socket, HttpRequest(scoped_ptr<net::StreamSocket> socket,
const std::string& request, const std::string& request,
const SocketCallback& callback) const HttpUpgradeCallback& callback)
: socket_(socket.Pass()), : socket_(socket.Pass()),
socket_callback_(callback), http_upgrade_callback_(callback),
body_pos_(0) { body_pos_(0) {
SendRequest(request); SendRequest(request);
} }
...@@ -146,17 +149,11 @@ class HttpRequest { ...@@ -146,17 +149,11 @@ class HttpRequest {
int expected_length = 0; int expected_length = 0;
if (bytes_total < 0) { if (bytes_total < 0) {
// TODO(kaznacheev): Use net::HttpResponseHeader to parse the header. // TODO(kaznacheev): Use net::HttpResponseHeader to parse the header.
size_t content_pos = response_.find("Content-Length:"); std::string content_length = ExtractHeader("Content-Length:");
if (content_pos != std::string::npos) { if (!content_length.empty()) {
size_t endline_pos = response_.find("\n", content_pos); if (!base::StringToInt(content_length, &expected_length)) {
if (endline_pos != std::string::npos) { CheckNetResultOrDie(net::ERR_FAILED);
std::string len = response_.substr(content_pos + 15, return;
endline_pos - content_pos - 15);
base::TrimWhitespace(len, base::TRIM_ALL, &len);
if (!base::StringToInt(len, &expected_length)) {
CheckNetResultOrDie(net::ERR_FAILED);
return;
}
} }
} }
...@@ -168,10 +165,12 @@ class HttpRequest { ...@@ -168,10 +165,12 @@ class HttpRequest {
} }
if (bytes_total == static_cast<int>(response_.length())) { if (bytes_total == static_cast<int>(response_.length())) {
if (!command_callback_.is_null()) if (!command_callback_.is_null()) {
command_callback_.Run(net::OK, response_.substr(body_pos_)); command_callback_.Run(net::OK, response_.substr(body_pos_));
else } else {
socket_callback_.Run(net::OK, socket_.Pass()); http_upgrade_callback_.Run(net::OK,
ExtractHeader("Sec-WebSocket-Extensions:"), socket_.Pass());
}
delete this; delete this;
return; return;
} }
...@@ -187,21 +186,38 @@ class HttpRequest { ...@@ -187,21 +186,38 @@ class HttpRequest {
OnResponseData(response_buffer, bytes_total, result); OnResponseData(response_buffer, bytes_total, result);
} }
std::string ExtractHeader(const std::string& header) {
size_t start_pos = response_.find(header);
if (start_pos == std::string::npos)
return std::string();
size_t endline_pos = response_.find("\n", start_pos);
if (endline_pos == std::string::npos)
return std::string();
std::string value = response_.substr(
start_pos + header.length(), endline_pos - start_pos - header.length());
base::TrimWhitespace(value, base::TRIM_ALL, &value);
return value;
}
bool CheckNetResultOrDie(int result) { bool CheckNetResultOrDie(int result) {
if (result >= 0) if (result >= 0)
return true; return true;
if (!command_callback_.is_null()) if (!command_callback_.is_null()) {
command_callback_.Run(result, std::string()); command_callback_.Run(result, std::string());
else } else {
socket_callback_.Run(result, make_scoped_ptr<net::StreamSocket>(NULL)); http_upgrade_callback_.Run(
result, "", make_scoped_ptr<net::StreamSocket>(nullptr));
}
delete this; delete this;
return false; return false;
} }
scoped_ptr<net::StreamSocket> socket_; scoped_ptr<net::StreamSocket> socket_;
std::string response_; std::string response_;
AndroidDeviceManager::CommandCallback command_callback_; CommandCallback command_callback_;
AndroidDeviceManager::SocketCallback socket_callback_; HttpUpgradeCallback http_upgrade_callback_;
size_t body_pos_; size_t body_pos_;
}; };
...@@ -305,12 +321,17 @@ void AndroidDeviceManager::DeviceProvider::HttpUpgrade( ...@@ -305,12 +321,17 @@ void AndroidDeviceManager::DeviceProvider::HttpUpgrade(
const std::string& serial, const std::string& serial,
const std::string& socket_name, const std::string& socket_name,
const std::string& url, const std::string& url,
const SocketCallback& callback) { const std::string& extensions,
const HttpUpgradeCallback& callback) {
std::string extensions_with_new_line =
extensions.empty() ? std::string() : extensions + "\r\n";
OpenSocket( OpenSocket(
serial, serial,
socket_name, socket_name,
base::Bind(&HttpRequest::SocketRequest, base::Bind(&HttpRequest::HttpUpgradeRequest,
base::StringPrintf(kWebSocketUpgradeRequest, url.c_str()), base::StringPrintf(kWebSocketUpgradeRequest,
url.c_str(),
extensions_with_new_line.c_str()),
callback)); callback));
} }
...@@ -363,9 +384,11 @@ void AndroidDeviceManager::Device::SendJsonRequest( ...@@ -363,9 +384,11 @@ void AndroidDeviceManager::Device::SendJsonRequest(
callback))); callback)));
} }
void AndroidDeviceManager::Device::HttpUpgrade(const std::string& socket_name, void AndroidDeviceManager::Device::HttpUpgrade(
const std::string& url, const std::string& socket_name,
const SocketCallback& callback) { const std::string& url,
const std::string& extensions,
const HttpUpgradeCallback& callback) {
message_loop_proxy_->PostTask( message_loop_proxy_->PostTask(
FROM_HERE, FROM_HERE,
base::Bind(&DeviceProvider::HttpUpgrade, base::Bind(&DeviceProvider::HttpUpgrade,
...@@ -373,7 +396,8 @@ void AndroidDeviceManager::Device::HttpUpgrade(const std::string& socket_name, ...@@ -373,7 +396,8 @@ void AndroidDeviceManager::Device::HttpUpgrade(const std::string& socket_name,
serial_, serial_,
socket_name, socket_name,
url, url,
base::Bind(&PostSocketCallback, extensions,
base::Bind(&PostHttpUpgradeCallback,
base::MessageLoopProxy::current(), base::MessageLoopProxy::current(),
callback))); callback)));
} }
......
...@@ -23,6 +23,9 @@ class AndroidDeviceManager : public base::NonThreadSafe { ...@@ -23,6 +23,9 @@ class AndroidDeviceManager : public base::NonThreadSafe {
typedef base::Callback<void(int, const std::string&)> CommandCallback; typedef base::Callback<void(int, const std::string&)> CommandCallback;
typedef base::Callback<void(int result, scoped_ptr<net::StreamSocket>)> typedef base::Callback<void(int result, scoped_ptr<net::StreamSocket>)>
SocketCallback; SocketCallback;
typedef base::Callback<void(
int result, const std::string& extensions, scoped_ptr<net::StreamSocket>)>
HttpUpgradeCallback;
typedef base::Callback<void(const std::vector<std::string>&)> SerialsCallback; typedef base::Callback<void(const std::vector<std::string>&)> SerialsCallback;
struct BrowserInfo { struct BrowserInfo {
...@@ -77,7 +80,9 @@ class AndroidDeviceManager : public base::NonThreadSafe { ...@@ -77,7 +80,9 @@ class AndroidDeviceManager : public base::NonThreadSafe {
const std::string& socket_name, const std::string& socket_name,
const std::string& url, const std::string& url,
AndroidWebSocket::Delegate* delegate); AndroidWebSocket::Delegate* delegate);
void Connected(int result, scoped_ptr<net::StreamSocket> socket); void Connected(int result,
const std::string& extensions,
scoped_ptr<net::StreamSocket> socket);
void OnFrameRead(const std::string& message); void OnFrameRead(const std::string& message);
void OnSocketClosed(); void OnSocketClosed();
void Terminate(); void Terminate();
...@@ -105,7 +110,8 @@ class AndroidDeviceManager : public base::NonThreadSafe { ...@@ -105,7 +110,8 @@ class AndroidDeviceManager : public base::NonThreadSafe {
void HttpUpgrade(const std::string& socket_name, void HttpUpgrade(const std::string& socket_name,
const std::string& url, const std::string& url,
const SocketCallback& callback); const std::string& extensions,
const HttpUpgradeCallback& callback);
AndroidWebSocket* CreateWebSocket( AndroidWebSocket* CreateWebSocket(
const std::string& socket_name, const std::string& socket_name,
const std::string& url, const std::string& url,
...@@ -160,7 +166,8 @@ class AndroidDeviceManager : public base::NonThreadSafe { ...@@ -160,7 +166,8 @@ class AndroidDeviceManager : public base::NonThreadSafe {
virtual void HttpUpgrade(const std::string& serial, virtual void HttpUpgrade(const std::string& serial,
const std::string& socket_name, const std::string& socket_name,
const std::string& url, const std::string& url,
const SocketCallback& callback); const std::string& extensions,
const HttpUpgradeCallback& callback);
virtual void ReleaseDevice(const std::string& serial); virtual void ReleaseDevice(const std::string& serial);
......
...@@ -25,11 +25,12 @@ class AndroidDeviceManager::AndroidWebSocket::WebSocketImpl { ...@@ -25,11 +25,12 @@ class AndroidDeviceManager::AndroidWebSocket::WebSocketImpl {
public: public:
WebSocketImpl(scoped_refptr<base::MessageLoopProxy> response_message_loop, WebSocketImpl(scoped_refptr<base::MessageLoopProxy> response_message_loop,
base::WeakPtr<AndroidWebSocket> weak_socket, base::WeakPtr<AndroidWebSocket> weak_socket,
const std::string& extensions,
scoped_ptr<net::StreamSocket> socket) scoped_ptr<net::StreamSocket> socket)
: response_message_loop_(response_message_loop), : response_message_loop_(response_message_loop),
weak_socket_(weak_socket), weak_socket_(weak_socket),
socket_(socket.Pass()), socket_(socket.Pass()),
encoder_(net::WebSocketEncoder::CreateClient(std::string())) { encoder_(net::WebSocketEncoder::CreateClient(extensions)) {
thread_checker_.DetachFromThread(); thread_checker_.DetachFromThread();
} }
...@@ -144,7 +145,7 @@ AndroidDeviceManager::AndroidWebSocket::AndroidWebSocket( ...@@ -144,7 +145,7 @@ AndroidDeviceManager::AndroidWebSocket::AndroidWebSocket(
DCHECK(device_); DCHECK(device_);
device_->sockets_.insert(this); device_->sockets_.insert(this);
device_->HttpUpgrade( device_->HttpUpgrade(
socket_name, url, socket_name, url, net::WebSocketEncoder::kClientExtensions,
base::Bind(&AndroidWebSocket::Connected, weak_factory_.GetWeakPtr())); base::Bind(&AndroidWebSocket::Connected, weak_factory_.GetWeakPtr()));
} }
...@@ -166,6 +167,7 @@ void AndroidDeviceManager::AndroidWebSocket::SendFrame( ...@@ -166,6 +167,7 @@ void AndroidDeviceManager::AndroidWebSocket::SendFrame(
void AndroidDeviceManager::AndroidWebSocket::Connected( void AndroidDeviceManager::AndroidWebSocket::Connected(
int result, int result,
const std::string& extensions,
scoped_ptr<net::StreamSocket> socket) { scoped_ptr<net::StreamSocket> socket) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
if (result != net::OK || !socket.get()) { if (result != net::OK || !socket.get()) {
...@@ -174,6 +176,7 @@ void AndroidDeviceManager::AndroidWebSocket::Connected( ...@@ -174,6 +176,7 @@ void AndroidDeviceManager::AndroidWebSocket::Connected(
} }
socket_impl_ = new WebSocketImpl(base::MessageLoopProxy::current(), socket_impl_ = new WebSocketImpl(base::MessageLoopProxy::current(),
weak_factory_.GetWeakPtr(), weak_factory_.GetWeakPtr(),
extensions,
socket.Pass()); socket.Pass());
device_->message_loop_proxy_->PostTask( device_->message_loop_proxy_->PostTask(
FROM_HERE, FROM_HERE,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment