diff options
author | byungchul@chromium.org <byungchul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-08-22 18:10:13 +0000 |
---|---|---|
committer | byungchul@chromium.org <byungchul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-08-22 18:12:05 +0000 |
commit | 3626bc39d629245a782c61ba0bc668583778e392 (patch) | |
tree | 7156999fdfb9044dd14d5463568b8f6ce01543fe /content/browser/devtools/devtools_http_handler_impl.cc | |
parent | 1c2f071e2a14a39b215a897434d30834ae959560 (diff) | |
download | chromium_src-3626bc39d629245a782c61ba0bc668583778e392.zip chromium_src-3626bc39d629245a782c61ba0bc668583778e392.tar.gz chromium_src-3626bc39d629245a782c61ba0bc668583778e392.tar.bz2 |
Replace StreamListenSocket with StreamSocket in HttpServer.
1) HttpServer gets ServerSocket instead of StreamListenSocket.
2) HttpConnection is just a container for socket, websocket, and pending read/write buffers.
3) HttpServer handles data buffering and asynchronous read/write.
4) HttpConnection has limit in data buffering, up to 1Mbytes by default.
5) For devtools, send buffer limit is 100Mbytes.
6) Unittests for buffer handling in HttpConnection.
BUG=371906
Review URL: https://codereview.chromium.org/296053012
Cr-Commit-Position: refs/heads/master@{#291447}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@291447 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/devtools/devtools_http_handler_impl.cc')
-rw-r--r-- | content/browser/devtools/devtools_http_handler_impl.cc | 82 |
1 files changed, 63 insertions, 19 deletions
diff --git a/content/browser/devtools/devtools_http_handler_impl.cc b/content/browser/devtools/devtools_http_handler_impl.cc index 72fe254..18d30e3 100644 --- a/content/browser/devtools/devtools_http_handler_impl.cc +++ b/content/browser/devtools/devtools_http_handler_impl.cc @@ -39,6 +39,7 @@ #include "net/base/net_errors.h" #include "net/server/http_server_request_info.h" #include "net/server/http_server_response_info.h" +#include "net/socket/server_socket.h" #if defined(OS_ANDROID) #include "base/android/build_info.h" @@ -67,6 +68,9 @@ const char kTargetFaviconUrlField[] = "faviconUrl"; const char kTargetWebSocketDebuggerUrlField[] = "webSocketDebuggerUrl"; const char kTargetDevtoolsFrontendUrlField[] = "devtoolsFrontendUrl"; +// Maximum write buffer size of devtools http/websocket connectinos. +const int32 kSendBufferSizeForDevTools = 100 * 1024 * 1024; // 100Mb + // An internal implementation of DevToolsAgentHostClient that delegates // messages sent to a DebuggerShell instance. class DevToolsAgentHostClientImpl : public DevToolsAgentHostClient { @@ -104,13 +108,15 @@ class DevToolsAgentHostClientImpl : public DevToolsAgentHostClient { message_loop_->PostTask( FROM_HERE, base::Bind(&net::HttpServer::SendOverWebSocket, - server_, + base::Unretained(server_), connection_id_, response)); message_loop_->PostTask( FROM_HERE, - base::Bind(&net::HttpServer::Close, server_, connection_id_)); + base::Bind(&net::HttpServer::Close, + base::Unretained(server_), + connection_id_)); } virtual void DispatchProtocolMessage( @@ -119,7 +125,7 @@ class DevToolsAgentHostClientImpl : public DevToolsAgentHostClient { message_loop_->PostTask( FROM_HERE, base::Bind(&net::HttpServer::SendOverWebSocket, - server_, + base::Unretained(server_), connection_id_, message)); } @@ -130,9 +136,9 @@ class DevToolsAgentHostClientImpl : public DevToolsAgentHostClient { } private: - base::MessageLoop* message_loop_; - net::HttpServer* server_; - int connection_id_; + base::MessageLoop* const message_loop_; + net::HttpServer* const server_; + const int connection_id_; scoped_refptr<DevToolsAgentHost> agent_host_; }; @@ -160,12 +166,12 @@ int DevToolsHttpHandler::GetFrontendResourceId(const std::string& name) { // static DevToolsHttpHandler* DevToolsHttpHandler::Start( - const net::StreamListenSocketFactory* socket_factory, + scoped_ptr<ServerSocketFactory> server_socket_factory, const std::string& frontend_url, DevToolsHttpHandlerDelegate* delegate, const base::FilePath& active_port_output_directory) { DevToolsHttpHandlerImpl* http_handler = - new DevToolsHttpHandlerImpl(socket_factory, + new DevToolsHttpHandlerImpl(server_socket_factory.Pass(), frontend_url, delegate, active_port_output_directory); @@ -173,6 +179,28 @@ DevToolsHttpHandler* DevToolsHttpHandler::Start( return http_handler; } +DevToolsHttpHandler::ServerSocketFactory::ServerSocketFactory( + const std::string& address, + int port, + int backlog) + : address_(address), + port_(port), + backlog_(backlog) { +} + +DevToolsHttpHandler::ServerSocketFactory::~ServerSocketFactory() { +} + +scoped_ptr<net::ServerSocket> +DevToolsHttpHandler::ServerSocketFactory::CreateAndListen() const { + scoped_ptr<net::ServerSocket> socket = Create(); + if (socket && + socket->ListenWithAddressAndPort(address_, port_, backlog_) == net::OK) { + return socket.Pass(); + } + return scoped_ptr<net::ServerSocket>(); +} + DevToolsHttpHandlerImpl::~DevToolsHttpHandlerImpl() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); // Stop() must be called prior to destruction. @@ -262,6 +290,8 @@ static std::string GetMimeType(const std::string& filename) { void DevToolsHttpHandlerImpl::OnHttpRequest( int connection_id, const net::HttpServerRequestInfo& info) { + server_->SetSendBufferSize(connection_id, kSendBufferSizeForDevTools); + if (info.path.find("/json") == 0) { BrowserThread::PostTask( BrowserThread::UI, @@ -351,6 +381,7 @@ void DevToolsHttpHandlerImpl::OnWebSocketRequest( true /* handle on UI thread */); browser_targets_[connection_id] = browser_target; + server_->SetSendBufferSize(connection_id, kSendBufferSizeForDevTools); server_->AcceptWebSocket(connection_id, request); return; } @@ -651,16 +682,16 @@ void DevToolsHttpHandlerImpl::OnCloseUI(int connection_id) { } DevToolsHttpHandlerImpl::DevToolsHttpHandlerImpl( - const net::StreamListenSocketFactory* socket_factory, + scoped_ptr<ServerSocketFactory> server_socket_factory, const std::string& frontend_url, DevToolsHttpHandlerDelegate* delegate, const base::FilePath& active_port_output_directory) : frontend_url_(frontend_url), - socket_factory_(socket_factory), + server_socket_factory_(server_socket_factory.Pass()), delegate_(delegate), active_port_output_directory_(active_port_output_directory) { if (frontend_url_.empty()) - frontend_url_ = "/devtools/devtools.html"; + frontend_url_ = "/devtools/devtools.html"; // Balanced in ResetHandlerThreadAndRelease(). AddRef(); @@ -668,14 +699,15 @@ DevToolsHttpHandlerImpl::DevToolsHttpHandlerImpl( // Runs on the handler thread void DevToolsHttpHandlerImpl::Init() { - server_ = new net::HttpServer(*socket_factory_.get(), this); + server_.reset(new net::HttpServer(server_socket_factory_->CreateAndListen(), + this)); if (!active_port_output_directory_.empty()) WriteActivePortToUserProfile(); } // Runs on the handler thread void DevToolsHttpHandlerImpl::Teardown() { - server_ = NULL; + server_.reset(NULL); } // Runs on FILE thread to make sure that it is serialized against @@ -733,7 +765,7 @@ void DevToolsHttpHandlerImpl::SendJson(int connection_id, thread_->message_loop()->PostTask( FROM_HERE, base::Bind(&net::HttpServer::SendResponse, - server_.get(), + base::Unretained(server_.get()), connection_id, response)); } @@ -746,7 +778,7 @@ void DevToolsHttpHandlerImpl::Send200(int connection_id, thread_->message_loop()->PostTask( FROM_HERE, base::Bind(&net::HttpServer::Send200, - server_.get(), + base::Unretained(server_.get()), connection_id, data, mime_type)); @@ -757,7 +789,9 @@ void DevToolsHttpHandlerImpl::Send404(int connection_id) { return; thread_->message_loop()->PostTask( FROM_HERE, - base::Bind(&net::HttpServer::Send404, server_.get(), connection_id)); + base::Bind(&net::HttpServer::Send404, + base::Unretained(server_.get()), + connection_id)); } void DevToolsHttpHandlerImpl::Send500(int connection_id, @@ -766,7 +800,9 @@ void DevToolsHttpHandlerImpl::Send500(int connection_id, return; thread_->message_loop()->PostTask( FROM_HERE, - base::Bind(&net::HttpServer::Send500, server_.get(), connection_id, + base::Bind(&net::HttpServer::Send500, + base::Unretained(server_.get()), + connection_id, message)); } @@ -777,8 +813,16 @@ void DevToolsHttpHandlerImpl::AcceptWebSocket( return; thread_->message_loop()->PostTask( FROM_HERE, - base::Bind(&net::HttpServer::AcceptWebSocket, server_.get(), - connection_id, request)); + base::Bind(&net::HttpServer::SetSendBufferSize, + base::Unretained(server_.get()), + connection_id, + kSendBufferSizeForDevTools)); + thread_->message_loop()->PostTask( + FROM_HERE, + base::Bind(&net::HttpServer::AcceptWebSocket, + base::Unretained(server_.get()), + connection_id, + request)); } base::DictionaryValue* DevToolsHttpHandlerImpl::SerializeTarget( |