15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_HTTP_HANDLER_IMPL_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_HTTP_HANDLER_IMPL_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h" 1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/browser/devtools_agent_host.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/devtools_http_handler.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/devtools_http_handler_delegate.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/devtools_manager_delegate.h" 20a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "net/http/http_status_code.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/server/http_server.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryValue; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ListValue; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Thread; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Value; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ServerSocketFactory; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestContextGetter; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DevToolsBrowserTarget; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DevToolsHttpHandlerImpl 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public DevToolsHttpHandler, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public base::RefCountedThreadSafe<DevToolsHttpHandlerImpl>, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public net::HttpServer::Delegate { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCountedThreadSafe<DevToolsHttpHandlerImpl>; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class DevToolsHttpHandler; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DevToolsHttpHandlerImpl(scoped_ptr<ServerSocketFactory> server_socket_factory, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& frontend_url, 4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DevToolsHttpHandlerDelegate* delegate, 5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::FilePath& active_port_output_directory); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DevToolsHttpHandlerImpl(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Start(); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DevToolsHttpHandler implementation. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Stop() OVERRIDE; 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual GURL GetFrontendURL() OVERRIDE; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // net::HttpServer::Delegate implementation. 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnConnect(int connection_id) OVERRIDE {} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnHttpRequest(int connection_id, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpServerRequestInfo& info) OVERRIDE; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnWebSocketRequest( 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int connection_id, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpServerRequestInfo& info) OVERRIDE; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnWebSocketMessage(int connection_id, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& data) OVERRIDE; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnClose(int connection_id) OVERRIDE; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnJsonRequestUI(int connection_id, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpServerRequestInfo& info); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnThumbnailRequestUI(int connection_id, const GURL& page_url); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnDiscoveryPageRequestUI(int connection_id); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnWebSocketRequestUI(int connection_id, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpServerRequestInfo& info); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnWebSocketMessageUI(int connection_id, const std::string& data); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnCloseUI(int connection_id); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ResetHandlerThread(); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ResetHandlerThreadAndRelease(); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void OnTargetListReceived( 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int connection_id, 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& host, 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const DevToolsManagerDelegate::TargetList& targets); 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DevToolsTarget* GetTarget(const std::string& id); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Init(); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Teardown(); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void StartHandlerThread(); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void StopHandlerThread(); 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void StopWithoutRelease(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void WriteActivePortToUserProfile(); 9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SendJson(int connection_id, 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::HttpStatusCode status_code, 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* value, 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& message); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Send200(int connection_id, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& data, 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& mime_type); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Send404(int connection_id); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Send500(int connection_id, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& message); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AcceptWebSocket(int connection_id, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpServerRequestInfo& request); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the front end url without the host at the beginning. 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string GetFrontendURLInternal(const std::string target_id, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& host); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::DictionaryValue* SerializeTarget(const DevToolsTarget& target, 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& host); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The thread used by the devtools handler to run server socket. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Thread> thread_; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string frontend_url_; 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const scoped_ptr<ServerSocketFactory> server_socket_factory_; 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<net::HttpServer> server_; 12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) typedef std::map<int, DevToolsAgentHostClient*> ConnectionToClientMap; 12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ConnectionToClientMap connection_to_client_ui_; 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const scoped_ptr<DevToolsHttpHandlerDelegate> delegate_; 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::FilePath active_port_output_directory_; 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) typedef std::map<std::string, DevToolsTarget*> TargetMap; 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) TargetMap target_map_; 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch typedef std::map<int, scoped_refptr<DevToolsBrowserTarget> > BrowserTargets; 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch BrowserTargets browser_targets_; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DevToolsHttpHandlerImpl); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_HTTP_HANDLER_IMPL_H_ 138