| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "content/browser/debugger/devtools_http_protocol_handler.h" | 5 #include "content/browser/debugger/devtools_http_handler_impl.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
| 11 #include "base/json/json_writer.h" | 11 #include "base/json/json_writer.h" |
| 12 #include "base/lazy_instance.h" | 12 #include "base/lazy_instance.h" |
| 13 #include "base/logging.h" | 13 #include "base/logging.h" |
| 14 #include "base/message_loop_proxy.h" | 14 #include "base/message_loop_proxy.h" |
| 15 #include "base/string_number_conversions.h" | 15 #include "base/string_number_conversions.h" |
| 16 #include "base/stringprintf.h" | 16 #include "base/stringprintf.h" |
| 17 #include "base/threading/thread.h" | 17 #include "base/threading/thread.h" |
| 18 #include "base/utf_string_conversions.h" | 18 #include "base/utf_string_conversions.h" |
| 19 #include "base/values.h" | 19 #include "base/values.h" |
| 20 #include "content/browser/tab_contents/tab_contents.h" | 20 #include "content/browser/tab_contents/tab_contents.h" |
| 21 #include "content/browser/tab_contents/tab_contents_observer.h" | 21 #include "content/browser/tab_contents/tab_contents_observer.h" |
| 22 #include "content/common/devtools_messages.h" | 22 #include "content/common/devtools_messages.h" |
| 23 #include "content/public/browser/browser_thread.h" | 23 #include "content/public/browser/browser_thread.h" |
| 24 #include "content/public/browser/devtools/devtools_agent_host_registry.h" | 24 #include "content/public/browser/devtools/devtools_agent_host_registry.h" |
| 25 #include "content/public/browser/devtools/devtools_client_host.h" | 25 #include "content/public/browser/devtools/devtools_client_host.h" |
| 26 #include "content/public/browser/devtools/devtools_http_handler.h" |
| 27 #include "content/public/browser/devtools/devtools_http_handler_delegate.h" |
| 26 #include "content/public/browser/devtools/devtools_manager.h" | 28 #include "content/public/browser/devtools/devtools_manager.h" |
| 27 #include "googleurl/src/gurl.h" | 29 #include "googleurl/src/gurl.h" |
| 28 #include "net/base/escape.h" | 30 #include "net/base/escape.h" |
| 29 #include "net/base/io_buffer.h" | 31 #include "net/base/io_buffer.h" |
| 30 #include "net/server/http_server_request_info.h" | 32 #include "net/server/http_server_request_info.h" |
| 31 #include "net/url_request/url_request_context.h" | 33 #include "net/url_request/url_request_context.h" |
| 32 | 34 |
| 33 using content::BrowserThread; | 35 namespace content { |
| 34 using content::DevToolsAgentHost; | |
| 35 using content::DevToolsAgentHostRegistry; | |
| 36 using content::DevToolsClientHost; | |
| 37 using content::DevToolsManager; | |
| 38 | 36 |
| 39 const int kBufferSize = 16 * 1024; | 37 const int kBufferSize = 16 * 1024; |
| 40 | 38 |
| 41 namespace { | 39 namespace { |
| 42 | 40 |
| 43 // An internal implementation of DevToolsClientHost that delegates | 41 // An internal implementation of DevToolsClientHost that delegates |
| 44 // messages sent for DevToolsClient to a DebuggerShell instance. | 42 // messages sent for DevToolsClient to a DebuggerShell instance. |
| 45 class DevToolsClientHostImpl : public DevToolsClientHost { | 43 class DevToolsClientHostImpl : public DevToolsClientHost { |
| 46 public: | 44 public: |
| 47 DevToolsClientHostImpl( | 45 DevToolsClientHostImpl( |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 base::LeakyLazyInstanceTraits<TabContentsIDHelper::IdToTabContentsMap> > | 141 base::LeakyLazyInstanceTraits<TabContentsIDHelper::IdToTabContentsMap> > |
| 144 TabContentsIDHelper::id_to_tabcontents_ = LAZY_INSTANCE_INITIALIZER; | 142 TabContentsIDHelper::id_to_tabcontents_ = LAZY_INSTANCE_INITIALIZER; |
| 145 base::LazyInstance< | 143 base::LazyInstance< |
| 146 TabContentsIDHelper::TabContentsToIdMap, | 144 TabContentsIDHelper::TabContentsToIdMap, |
| 147 base::LeakyLazyInstanceTraits<TabContentsIDHelper::TabContentsToIdMap> > | 145 base::LeakyLazyInstanceTraits<TabContentsIDHelper::TabContentsToIdMap> > |
| 148 TabContentsIDHelper::tabcontents_to_id_ = LAZY_INSTANCE_INITIALIZER; | 146 TabContentsIDHelper::tabcontents_to_id_ = LAZY_INSTANCE_INITIALIZER; |
| 149 | 147 |
| 150 } // namespace | 148 } // namespace |
| 151 | 149 |
| 152 // static | 150 // static |
| 153 scoped_refptr<DevToolsHttpProtocolHandler> DevToolsHttpProtocolHandler::Start( | 151 scoped_refptr<DevToolsHttpHandler> DevToolsHttpHandler::Start( |
| 154 const std::string& ip, | 152 const std::string& ip, |
| 155 int port, | 153 int port, |
| 156 const std::string& frontend_url, | 154 const std::string& frontend_url, |
| 157 Delegate* delegate) { | 155 DevToolsHttpHandlerDelegate* delegate) { |
| 158 scoped_refptr<DevToolsHttpProtocolHandler> http_handler = | 156 scoped_refptr<DevToolsHttpHandlerImpl> http_handler = |
| 159 new DevToolsHttpProtocolHandler(ip, port, frontend_url, delegate); | 157 new DevToolsHttpHandlerImpl(ip, port, frontend_url, delegate); |
| 160 http_handler->Start(); | 158 http_handler->Start(); |
| 161 return http_handler; | 159 return http_handler; |
| 162 } | 160 } |
| 163 | 161 |
| 164 DevToolsHttpProtocolHandler::~DevToolsHttpProtocolHandler() { | 162 DevToolsHttpHandlerImpl::~DevToolsHttpHandlerImpl() { |
| 165 // Stop() must be called prior to this being called | 163 // Stop() must be called prior to this being called |
| 166 DCHECK(server_.get() == NULL); | 164 DCHECK(server_.get() == NULL); |
| 167 } | 165 } |
| 168 | 166 |
| 169 void DevToolsHttpProtocolHandler::Start() { | 167 void DevToolsHttpHandlerImpl::Start() { |
| 170 BrowserThread::PostTask( | 168 BrowserThread::PostTask( |
| 171 BrowserThread::IO, FROM_HERE, | 169 BrowserThread::IO, FROM_HERE, |
| 172 base::Bind(&DevToolsHttpProtocolHandler::Init, this)); | 170 base::Bind(&DevToolsHttpHandlerImpl::Init, this)); |
| 173 } | 171 } |
| 174 | 172 |
| 175 void DevToolsHttpProtocolHandler::Stop() { | 173 void DevToolsHttpHandlerImpl::Stop() { |
| 176 BrowserThread::PostTask( | 174 BrowserThread::PostTask( |
| 177 BrowserThread::IO, FROM_HERE, | 175 BrowserThread::IO, FROM_HERE, |
| 178 base::Bind(&DevToolsHttpProtocolHandler::Teardown, this)); | 176 base::Bind(&DevToolsHttpHandlerImpl::Teardown, this)); |
| 179 } | 177 } |
| 180 | 178 |
| 181 void DevToolsHttpProtocolHandler::OnHttpRequest( | 179 void DevToolsHttpHandlerImpl::OnHttpRequest( |
| 182 int connection_id, | 180 int connection_id, |
| 183 const net::HttpServerRequestInfo& info) { | 181 const net::HttpServerRequestInfo& info) { |
| 184 if (info.path == "/json") { | 182 if (info.path == "/json") { |
| 185 // Pages discovery json request. | 183 // Pages discovery json request. |
| 186 BrowserThread::PostTask( | 184 BrowserThread::PostTask( |
| 187 BrowserThread::UI, | 185 BrowserThread::UI, |
| 188 FROM_HERE, | 186 FROM_HERE, |
| 189 base::Bind(&DevToolsHttpProtocolHandler::OnJsonRequestUI, | 187 base::Bind(&DevToolsHttpHandlerImpl::OnJsonRequestUI, |
| 190 this, | 188 this, |
| 191 connection_id, | 189 connection_id, |
| 192 info)); | 190 info)); |
| 193 return; | 191 return; |
| 194 } | 192 } |
| 195 | 193 |
| 196 // Proxy static files from chrome-devtools://devtools/*. | 194 // Proxy static files from chrome-devtools://devtools/*. |
| 197 net::URLRequestContext* request_context = delegate_->GetURLRequestContext(); | 195 net::URLRequestContext* request_context = delegate_->GetURLRequestContext(); |
| 198 if (!request_context) { | 196 if (!request_context) { |
| 199 server_->Send404(connection_id); | 197 server_->Send404(connection_id); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 215 } else { | 213 } else { |
| 216 server_->Send404(connection_id); | 214 server_->Send404(connection_id); |
| 217 return; | 215 return; |
| 218 } | 216 } |
| 219 | 217 |
| 220 Bind(request, connection_id); | 218 Bind(request, connection_id); |
| 221 request->set_context(request_context); | 219 request->set_context(request_context); |
| 222 request->Start(); | 220 request->Start(); |
| 223 } | 221 } |
| 224 | 222 |
| 225 void DevToolsHttpProtocolHandler::OnWebSocketRequest( | 223 void DevToolsHttpHandlerImpl::OnWebSocketRequest( |
| 226 int connection_id, | 224 int connection_id, |
| 227 const net::HttpServerRequestInfo& request) { | 225 const net::HttpServerRequestInfo& request) { |
| 228 BrowserThread::PostTask( | 226 BrowserThread::PostTask( |
| 229 BrowserThread::UI, | 227 BrowserThread::UI, |
| 230 FROM_HERE, | 228 FROM_HERE, |
| 231 base::Bind( | 229 base::Bind( |
| 232 &DevToolsHttpProtocolHandler::OnWebSocketRequestUI, | 230 &DevToolsHttpHandlerImpl::OnWebSocketRequestUI, |
| 233 this, | 231 this, |
| 234 connection_id, | 232 connection_id, |
| 235 request)); | 233 request)); |
| 236 } | 234 } |
| 237 | 235 |
| 238 void DevToolsHttpProtocolHandler::OnWebSocketMessage( | 236 void DevToolsHttpHandlerImpl::OnWebSocketMessage( |
| 239 int connection_id, | 237 int connection_id, |
| 240 const std::string& data) { | 238 const std::string& data) { |
| 241 BrowserThread::PostTask( | 239 BrowserThread::PostTask( |
| 242 BrowserThread::UI, | 240 BrowserThread::UI, |
| 243 FROM_HERE, | 241 FROM_HERE, |
| 244 base::Bind( | 242 base::Bind( |
| 245 &DevToolsHttpProtocolHandler::OnWebSocketMessageUI, | 243 &DevToolsHttpHandlerImpl::OnWebSocketMessageUI, |
| 246 this, | 244 this, |
| 247 connection_id, | 245 connection_id, |
| 248 data)); | 246 data)); |
| 249 } | 247 } |
| 250 | 248 |
| 251 void DevToolsHttpProtocolHandler::OnClose(int connection_id) { | 249 void DevToolsHttpHandlerImpl::OnClose(int connection_id) { |
| 252 ConnectionToRequestsMap::iterator it = | 250 ConnectionToRequestsMap::iterator it = |
| 253 connection_to_requests_io_.find(connection_id); | 251 connection_to_requests_io_.find(connection_id); |
| 254 if (it != connection_to_requests_io_.end()) { | 252 if (it != connection_to_requests_io_.end()) { |
| 255 // Dispose delegating socket. | 253 // Dispose delegating socket. |
| 256 for (std::set<net::URLRequest*>::iterator it2 = it->second.begin(); | 254 for (std::set<net::URLRequest*>::iterator it2 = it->second.begin(); |
| 257 it2 != it->second.end(); ++it2) { | 255 it2 != it->second.end(); ++it2) { |
| 258 net::URLRequest* request = *it2; | 256 net::URLRequest* request = *it2; |
| 259 request->Cancel(); | 257 request->Cancel(); |
| 260 request_to_connection_io_.erase(request); | 258 request_to_connection_io_.erase(request); |
| 261 request_to_buffer_io_.erase(request); | 259 request_to_buffer_io_.erase(request); |
| 262 delete request; | 260 delete request; |
| 263 } | 261 } |
| 264 connection_to_requests_io_.erase(connection_id); | 262 connection_to_requests_io_.erase(connection_id); |
| 265 } | 263 } |
| 266 | 264 |
| 267 BrowserThread::PostTask( | 265 BrowserThread::PostTask( |
| 268 BrowserThread::UI, | 266 BrowserThread::UI, |
| 269 FROM_HERE, | 267 FROM_HERE, |
| 270 base::Bind( | 268 base::Bind( |
| 271 &DevToolsHttpProtocolHandler::OnCloseUI, | 269 &DevToolsHttpHandlerImpl::OnCloseUI, |
| 272 this, | 270 this, |
| 273 connection_id)); | 271 connection_id)); |
| 274 } | 272 } |
| 275 | 273 |
| 276 struct PageInfo | 274 struct PageInfo |
| 277 { | 275 { |
| 278 int id; | 276 int id; |
| 279 std::string url; | 277 std::string url; |
| 280 bool attached; | 278 bool attached; |
| 281 std::string title; | 279 std::string title; |
| 282 std::string thumbnail_url; | 280 std::string thumbnail_url; |
| 283 std::string favicon_url; | 281 std::string favicon_url; |
| 284 }; | 282 }; |
| 285 typedef std::vector<PageInfo> PageList; | 283 typedef std::vector<PageInfo> PageList; |
| 286 | 284 |
| 287 static PageList GeneratePageList( | 285 static PageList GeneratePageList( |
| 288 DevToolsHttpProtocolHandler::Delegate* delegate, | 286 DevToolsHttpHandlerDelegate* delegate, |
| 289 int connection_id, | 287 int connection_id, |
| 290 const net::HttpServerRequestInfo& info) { | 288 const net::HttpServerRequestInfo& info) { |
| 291 typedef DevToolsHttpProtocolHandler::InspectableTabs Tabs; | 289 typedef DevToolsHttpHandlerDelegate::InspectableTabs Tabs; |
| 292 Tabs inspectable_tabs = delegate->GetInspectableTabs(); | 290 Tabs inspectable_tabs = delegate->GetInspectableTabs(); |
| 293 | 291 |
| 294 PageList page_list; | 292 PageList page_list; |
| 295 for (Tabs::iterator it = inspectable_tabs.begin(); | 293 for (Tabs::iterator it = inspectable_tabs.begin(); |
| 296 it != inspectable_tabs.end(); ++it) { | 294 it != inspectable_tabs.end(); ++it) { |
| 297 | 295 |
| 298 TabContents* tab_contents = *it; | 296 TabContents* tab_contents = *it; |
| 299 NavigationController& controller = tab_contents->controller(); | 297 NavigationController& controller = tab_contents->controller(); |
| 300 | 298 |
| 301 NavigationEntry* entry = controller.GetActiveEntry(); | 299 NavigationEntry* entry = controller.GetActiveEntry(); |
| 302 if (entry == NULL || !entry->url().is_valid()) | 300 if (entry == NULL || !entry->url().is_valid()) |
| 303 continue; | 301 continue; |
| 304 | 302 |
| 305 DevToolsAgentHost* agent = DevToolsAgentHostRegistry::GetDevToolsAgentHost( | 303 DevToolsAgentHost* agent = DevToolsAgentHostRegistry::GetDevToolsAgentHost( |
| 306 tab_contents->render_view_host()); | 304 tab_contents->render_view_host()); |
| 307 DevToolsClientHost* client_host = DevToolsManager::GetInstance()-> | 305 DevToolsClientHost* client_host = DevToolsManager::GetInstance()-> |
| 308 GetDevToolsClientHostFor(agent); | 306 GetDevToolsClientHostFor(agent); |
| 309 PageInfo page_info; | 307 PageInfo page_info; |
| 310 page_info.id = TabContentsIDHelper::GetID(tab_contents); | 308 page_info.id = TabContentsIDHelper::GetID(tab_contents); |
| 311 page_info.attached = client_host != NULL; | 309 page_info.attached = client_host != NULL; |
| 312 page_info.url = entry->url().spec(); | 310 page_info.url = entry->url().spec(); |
| 313 page_info.title = UTF16ToUTF8(net::EscapeForHTML(entry->title())); | 311 page_info.title = UTF16ToUTF8(net::EscapeForHTML(entry->title())); |
| 314 page_info.thumbnail_url = "/thumb/" + entry->url().spec(); | 312 page_info.thumbnail_url = "/thumb/" + entry->url().spec(); |
| 315 page_info.favicon_url = entry->favicon().url().spec(); | 313 page_info.favicon_url = entry->favicon().url().spec(); |
| 316 page_list.push_back(page_info); | 314 page_list.push_back(page_info); |
| 317 } | 315 } |
| 318 return page_list; | 316 return page_list; |
| 319 } | 317 } |
| 320 | 318 |
| 321 void DevToolsHttpProtocolHandler::OnJsonRequestUI( | 319 void DevToolsHttpHandlerImpl::OnJsonRequestUI( |
| 322 int connection_id, | 320 int connection_id, |
| 323 const net::HttpServerRequestInfo& info) { | 321 const net::HttpServerRequestInfo& info) { |
| 324 PageList page_list = GeneratePageList(delegate_.get(), | 322 PageList page_list = GeneratePageList(delegate_.get(), |
| 325 connection_id, info); | 323 connection_id, info); |
| 326 ListValue json_pages_list; | 324 ListValue json_pages_list; |
| 327 std::string host = info.headers["Host"]; | 325 std::string host = info.headers["Host"]; |
| 328 for (PageList::iterator i = page_list.begin(); | 326 for (PageList::iterator i = page_list.begin(); |
| 329 i != page_list.end(); ++i) { | 327 i != page_list.end(); ++i) { |
| 330 | 328 |
| 331 DictionaryValue* page_info = new DictionaryValue; | 329 DictionaryValue* page_info = new DictionaryValue; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 345 host.c_str(), | 343 host.c_str(), |
| 346 i->id)); | 344 i->id)); |
| 347 } | 345 } |
| 348 } | 346 } |
| 349 | 347 |
| 350 std::string response; | 348 std::string response; |
| 351 base::JSONWriter::Write(&json_pages_list, true, &response); | 349 base::JSONWriter::Write(&json_pages_list, true, &response); |
| 352 Send200(connection_id, response, "application/json; charset=UTF-8"); | 350 Send200(connection_id, response, "application/json; charset=UTF-8"); |
| 353 } | 351 } |
| 354 | 352 |
| 355 void DevToolsHttpProtocolHandler::OnWebSocketRequestUI( | 353 void DevToolsHttpHandlerImpl::OnWebSocketRequestUI( |
| 356 int connection_id, | 354 int connection_id, |
| 357 const net::HttpServerRequestInfo& request) { | 355 const net::HttpServerRequestInfo& request) { |
| 358 std::string prefix = "/devtools/page/"; | 356 std::string prefix = "/devtools/page/"; |
| 359 size_t pos = request.path.find(prefix); | 357 size_t pos = request.path.find(prefix); |
| 360 if (pos != 0) { | 358 if (pos != 0) { |
| 361 Send404(connection_id); | 359 Send404(connection_id); |
| 362 return; | 360 return; |
| 363 } | 361 } |
| 364 std::string page_id = request.path.substr(prefix.length()); | 362 std::string page_id = request.path.substr(prefix.length()); |
| 365 int id = 0; | 363 int id = 0; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 387 connection_to_client_host_ui_[connection_id] = client_host; | 385 connection_to_client_host_ui_[connection_id] = client_host; |
| 388 | 386 |
| 389 manager->RegisterDevToolsClientHostFor(agent, client_host); | 387 manager->RegisterDevToolsClientHostFor(agent, client_host); |
| 390 manager->ForwardToDevToolsAgent( | 388 manager->ForwardToDevToolsAgent( |
| 391 client_host, | 389 client_host, |
| 392 DevToolsAgentMsg_FrontendLoaded(MSG_ROUTING_NONE)); | 390 DevToolsAgentMsg_FrontendLoaded(MSG_ROUTING_NONE)); |
| 393 | 391 |
| 394 AcceptWebSocket(connection_id, request); | 392 AcceptWebSocket(connection_id, request); |
| 395 } | 393 } |
| 396 | 394 |
| 397 void DevToolsHttpProtocolHandler::OnWebSocketMessageUI( | 395 void DevToolsHttpHandlerImpl::OnWebSocketMessageUI( |
| 398 int connection_id, | 396 int connection_id, |
| 399 const std::string& data) { | 397 const std::string& data) { |
| 400 ConnectionToClientHostMap::iterator it = | 398 ConnectionToClientHostMap::iterator it = |
| 401 connection_to_client_host_ui_.find(connection_id); | 399 connection_to_client_host_ui_.find(connection_id); |
| 402 if (it == connection_to_client_host_ui_.end()) | 400 if (it == connection_to_client_host_ui_.end()) |
| 403 return; | 401 return; |
| 404 | 402 |
| 405 DevToolsManager* manager = DevToolsManager::GetInstance(); | 403 DevToolsManager* manager = DevToolsManager::GetInstance(); |
| 406 manager->ForwardToDevToolsAgent( | 404 manager->ForwardToDevToolsAgent( |
| 407 it->second, | 405 it->second, |
| 408 DevToolsAgentMsg_DispatchOnInspectorBackend(MSG_ROUTING_NONE, data)); | 406 DevToolsAgentMsg_DispatchOnInspectorBackend(MSG_ROUTING_NONE, data)); |
| 409 } | 407 } |
| 410 | 408 |
| 411 void DevToolsHttpProtocolHandler::OnCloseUI(int connection_id) { | 409 void DevToolsHttpHandlerImpl::OnCloseUI(int connection_id) { |
| 412 ConnectionToClientHostMap::iterator it = | 410 ConnectionToClientHostMap::iterator it = |
| 413 connection_to_client_host_ui_.find(connection_id); | 411 connection_to_client_host_ui_.find(connection_id); |
| 414 if (it != connection_to_client_host_ui_.end()) { | 412 if (it != connection_to_client_host_ui_.end()) { |
| 415 DevToolsClientHostImpl* client_host = | 413 DevToolsClientHostImpl* client_host = |
| 416 static_cast<DevToolsClientHostImpl*>(it->second); | 414 static_cast<DevToolsClientHostImpl*>(it->second); |
| 417 client_host->NotifyCloseListener(); | 415 client_host->NotifyCloseListener(); |
| 418 delete client_host; | 416 delete client_host; |
| 419 connection_to_client_host_ui_.erase(connection_id); | 417 connection_to_client_host_ui_.erase(connection_id); |
| 420 } | 418 } |
| 421 } | 419 } |
| 422 | 420 |
| 423 void DevToolsHttpProtocolHandler::OnResponseStarted(net::URLRequest* request) { | 421 void DevToolsHttpHandlerImpl::OnResponseStarted(net::URLRequest* request) { |
| 424 RequestToSocketMap::iterator it = request_to_connection_io_.find(request); | 422 RequestToSocketMap::iterator it = request_to_connection_io_.find(request); |
| 425 if (it == request_to_connection_io_.end()) | 423 if (it == request_to_connection_io_.end()) |
| 426 return; | 424 return; |
| 427 | 425 |
| 428 int connection_id = it->second; | 426 int connection_id = it->second; |
| 429 | 427 |
| 430 std::string content_type; | 428 std::string content_type; |
| 431 request->GetMimeType(&content_type); | 429 request->GetMimeType(&content_type); |
| 432 | 430 |
| 433 if (request->status().is_success()) { | 431 if (request->status().is_success()) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 445 // Some servers may treat HEAD requests as GET requests. To free up the | 443 // Some servers may treat HEAD requests as GET requests. To free up the |
| 446 // network connection as soon as possible, signal that the request has | 444 // network connection as soon as possible, signal that the request has |
| 447 // completed immediately, without trying to read any data back (all we care | 445 // completed immediately, without trying to read any data back (all we care |
| 448 // about is the response code and headers, which we already have). | 446 // about is the response code and headers, which we already have). |
| 449 net::IOBuffer* buffer = request_to_buffer_io_[request].get(); | 447 net::IOBuffer* buffer = request_to_buffer_io_[request].get(); |
| 450 if (request->status().is_success()) | 448 if (request->status().is_success()) |
| 451 request->Read(buffer, kBufferSize, &bytes_read); | 449 request->Read(buffer, kBufferSize, &bytes_read); |
| 452 OnReadCompleted(request, bytes_read); | 450 OnReadCompleted(request, bytes_read); |
| 453 } | 451 } |
| 454 | 452 |
| 455 void DevToolsHttpProtocolHandler::OnReadCompleted(net::URLRequest* request, | 453 void DevToolsHttpHandlerImpl::OnReadCompleted(net::URLRequest* request, |
| 456 int bytes_read) { | 454 int bytes_read) { |
| 457 RequestToSocketMap::iterator it = request_to_connection_io_.find(request); | 455 RequestToSocketMap::iterator it = request_to_connection_io_.find(request); |
| 458 if (it == request_to_connection_io_.end()) | 456 if (it == request_to_connection_io_.end()) |
| 459 return; | 457 return; |
| 460 | 458 |
| 461 int connection_id = it->second; | 459 int connection_id = it->second; |
| 462 | 460 |
| 463 net::IOBuffer* buffer = request_to_buffer_io_[request].get(); | 461 net::IOBuffer* buffer = request_to_buffer_io_[request].get(); |
| 464 do { | 462 do { |
| 465 if (!request->status().is_success() || bytes_read <= 0) | 463 if (!request->status().is_success() || bytes_read <= 0) |
| 466 break; | 464 break; |
| 467 std::string chunk_size = base::StringPrintf("%X\r\n", bytes_read); | 465 std::string chunk_size = base::StringPrintf("%X\r\n", bytes_read); |
| 468 server_->Send(connection_id, chunk_size); | 466 server_->Send(connection_id, chunk_size); |
| 469 server_->Send(connection_id, buffer->data(), bytes_read); | 467 server_->Send(connection_id, buffer->data(), bytes_read); |
| 470 server_->Send(connection_id, "\r\n"); | 468 server_->Send(connection_id, "\r\n"); |
| 471 } while (request->Read(buffer, kBufferSize, &bytes_read)); | 469 } while (request->Read(buffer, kBufferSize, &bytes_read)); |
| 472 | 470 |
| 473 | 471 |
| 474 // See comments re: HEAD requests in OnResponseStarted(). | 472 // See comments re: HEAD requests in OnResponseStarted(). |
| 475 if (!request->status().is_io_pending()) { | 473 if (!request->status().is_io_pending()) { |
| 476 server_->Send(connection_id, "0\r\n\r\n"); | 474 server_->Send(connection_id, "0\r\n\r\n"); |
| 477 RequestCompleted(request); | 475 RequestCompleted(request); |
| 478 } | 476 } |
| 479 } | 477 } |
| 480 | 478 |
| 481 DevToolsHttpProtocolHandler::DevToolsHttpProtocolHandler( | 479 DevToolsHttpHandlerImpl::DevToolsHttpHandlerImpl( |
| 482 const std::string& ip, | 480 const std::string& ip, |
| 483 int port, | 481 int port, |
| 484 const std::string& frontend_host, | 482 const std::string& frontend_host, |
| 485 Delegate* delegate) | 483 DevToolsHttpHandlerDelegate* delegate) |
| 486 : ip_(ip), | 484 : ip_(ip), |
| 487 port_(port), | 485 port_(port), |
| 488 overridden_frontend_url_(frontend_host), | 486 overridden_frontend_url_(frontend_host), |
| 489 delegate_(delegate) { | 487 delegate_(delegate) { |
| 490 if (overridden_frontend_url_.empty()) | 488 if (overridden_frontend_url_.empty()) |
| 491 overridden_frontend_url_ = "/devtools/devtools.html"; | 489 overridden_frontend_url_ = "/devtools/devtools.html"; |
| 492 } | 490 } |
| 493 | 491 |
| 494 void DevToolsHttpProtocolHandler::Init() { | 492 void DevToolsHttpHandlerImpl::Init() { |
| 495 server_ = new net::HttpServer(ip_, port_, this); | 493 server_ = new net::HttpServer(ip_, port_, this); |
| 496 } | 494 } |
| 497 | 495 |
| 498 // Run on I/O thread | 496 // Run on I/O thread |
| 499 void DevToolsHttpProtocolHandler::Teardown() { | 497 void DevToolsHttpHandlerImpl::Teardown() { |
| 500 server_ = NULL; | 498 server_ = NULL; |
| 501 } | 499 } |
| 502 | 500 |
| 503 void DevToolsHttpProtocolHandler::Bind(net::URLRequest* request, | 501 void DevToolsHttpHandlerImpl::Bind(net::URLRequest* request, |
| 504 int connection_id) { | 502 int connection_id) { |
| 505 request_to_connection_io_[request] = connection_id; | 503 request_to_connection_io_[request] = connection_id; |
| 506 ConnectionToRequestsMap::iterator it = | 504 ConnectionToRequestsMap::iterator it = |
| 507 connection_to_requests_io_.find(connection_id); | 505 connection_to_requests_io_.find(connection_id); |
| 508 if (it == connection_to_requests_io_.end()) { | 506 if (it == connection_to_requests_io_.end()) { |
| 509 std::pair<int, std::set<net::URLRequest*> > value( | 507 std::pair<int, std::set<net::URLRequest*> > value( |
| 510 connection_id, | 508 connection_id, |
| 511 std::set<net::URLRequest*>()); | 509 std::set<net::URLRequest*>()); |
| 512 it = connection_to_requests_io_.insert(value).first; | 510 it = connection_to_requests_io_.insert(value).first; |
| 513 } | 511 } |
| 514 it->second.insert(request); | 512 it->second.insert(request); |
| 515 request_to_buffer_io_[request] = new net::IOBuffer(kBufferSize); | 513 request_to_buffer_io_[request] = new net::IOBuffer(kBufferSize); |
| 516 } | 514 } |
| 517 | 515 |
| 518 void DevToolsHttpProtocolHandler::RequestCompleted(net::URLRequest* request) { | 516 void DevToolsHttpHandlerImpl::RequestCompleted(net::URLRequest* request) { |
| 519 RequestToSocketMap::iterator it = request_to_connection_io_.find(request); | 517 RequestToSocketMap::iterator it = request_to_connection_io_.find(request); |
| 520 if (it == request_to_connection_io_.end()) | 518 if (it == request_to_connection_io_.end()) |
| 521 return; | 519 return; |
| 522 | 520 |
| 523 int connection_id = it->second; | 521 int connection_id = it->second; |
| 524 request_to_connection_io_.erase(request); | 522 request_to_connection_io_.erase(request); |
| 525 ConnectionToRequestsMap::iterator it2 = | 523 ConnectionToRequestsMap::iterator it2 = |
| 526 connection_to_requests_io_.find(connection_id); | 524 connection_to_requests_io_.find(connection_id); |
| 527 it2->second.erase(request); | 525 it2->second.erase(request); |
| 528 request_to_buffer_io_.erase(request); | 526 request_to_buffer_io_.erase(request); |
| 529 delete request; | 527 delete request; |
| 530 } | 528 } |
| 531 | 529 |
| 532 void DevToolsHttpProtocolHandler::Send200(int connection_id, | 530 void DevToolsHttpHandlerImpl::Send200(int connection_id, |
| 533 const std::string& data, | 531 const std::string& data, |
| 534 const std::string& mime_type) { | 532 const std::string& mime_type) { |
| 535 BrowserThread::PostTask( | 533 BrowserThread::PostTask( |
| 536 BrowserThread::IO, FROM_HERE, | 534 BrowserThread::IO, FROM_HERE, |
| 537 base::Bind(&net::HttpServer::Send200, | 535 base::Bind(&net::HttpServer::Send200, |
| 538 server_.get(), | 536 server_.get(), |
| 539 connection_id, | 537 connection_id, |
| 540 data, | 538 data, |
| 541 mime_type)); | 539 mime_type)); |
| 542 } | 540 } |
| 543 | 541 |
| 544 void DevToolsHttpProtocolHandler::Send404(int connection_id) { | 542 void DevToolsHttpHandlerImpl::Send404(int connection_id) { |
| 545 BrowserThread::PostTask( | 543 BrowserThread::PostTask( |
| 546 BrowserThread::IO, FROM_HERE, | 544 BrowserThread::IO, FROM_HERE, |
| 547 base::Bind(&net::HttpServer::Send404, server_.get(), connection_id)); | 545 base::Bind(&net::HttpServer::Send404, server_.get(), connection_id)); |
| 548 } | 546 } |
| 549 | 547 |
| 550 void DevToolsHttpProtocolHandler::Send500(int connection_id, | 548 void DevToolsHttpHandlerImpl::Send500(int connection_id, |
| 551 const std::string& message) { | 549 const std::string& message) { |
| 552 BrowserThread::PostTask( | 550 BrowserThread::PostTask( |
| 553 BrowserThread::IO, FROM_HERE, | 551 BrowserThread::IO, FROM_HERE, |
| 554 base::Bind(&net::HttpServer::Send500, server_.get(), connection_id, | 552 base::Bind(&net::HttpServer::Send500, server_.get(), connection_id, |
| 555 message)); | 553 message)); |
| 556 } | 554 } |
| 557 | 555 |
| 558 void DevToolsHttpProtocolHandler::AcceptWebSocket( | 556 void DevToolsHttpHandlerImpl::AcceptWebSocket( |
| 559 int connection_id, | 557 int connection_id, |
| 560 const net::HttpServerRequestInfo& request) { | 558 const net::HttpServerRequestInfo& request) { |
| 561 BrowserThread::PostTask( | 559 BrowserThread::PostTask( |
| 562 BrowserThread::IO, FROM_HERE, | 560 BrowserThread::IO, FROM_HERE, |
| 563 base::Bind(&net::HttpServer::AcceptWebSocket, server_.get(), | 561 base::Bind(&net::HttpServer::AcceptWebSocket, server_.get(), |
| 564 connection_id, request)); | 562 connection_id, request)); |
| 565 } | 563 } |
| 564 |
| 565 } // namespace content |
| OLD | NEW |