|  | // Copyright 2012 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_HTTP_HANDLER_H_ | 
|  | #define CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_HTTP_HANDLER_H_ | 
|  |  | 
|  | #include <map> | 
|  | #include <memory> | 
|  | #include <optional> | 
|  | #include <set> | 
|  | #include <string> | 
|  |  | 
|  | #include "base/files/file_path.h" | 
|  | #include "base/memory/raw_ptr.h" | 
|  | #include "base/memory/weak_ptr.h" | 
|  | #include "base/values.h" | 
|  | #include "content/public/browser/devtools_agent_host.h" | 
|  | #include "net/http/http_status_code.h" | 
|  |  | 
|  | namespace base { | 
|  | class Thread; | 
|  | } | 
|  |  | 
|  | namespace content { | 
|  | class DevToolsManagerDelegate; | 
|  | class DevToolsSocketFactory; | 
|  | } | 
|  |  | 
|  | namespace net { | 
|  | class IPEndPoint; | 
|  | class HttpServerRequestInfo; | 
|  | } | 
|  |  | 
|  | namespace content { | 
|  |  | 
|  | class DevToolsAgentHostClientImpl; | 
|  | class ServerWrapper; | 
|  |  | 
|  | // This class is used for managing DevTools remote debugging server. | 
|  | // Clients can connect to the specified ip:port and start debugging | 
|  | // this browser. | 
|  | class DevToolsHttpHandler { | 
|  | public: | 
|  | // Takes ownership over |socket_factory|. | 
|  | // |delegate| is only accessed on UI thread. | 
|  | // If |active_port_output_directory| is non-empty, it is assumed the | 
|  | // socket_factory was initialized with an ephemeral port (0). The | 
|  | // port selected by the OS will be written to a well-known file in | 
|  | // the output directory. | 
|  | DevToolsHttpHandler( | 
|  | DevToolsManagerDelegate* delegate, | 
|  | std::unique_ptr<DevToolsSocketFactory> server_socket_factory, | 
|  | const base::FilePath& active_port_output_directory, | 
|  | const base::FilePath& debug_frontend_dir); | 
|  |  | 
|  | DevToolsHttpHandler(const DevToolsHttpHandler&) = delete; | 
|  | DevToolsHttpHandler& operator=(const DevToolsHttpHandler&) = delete; | 
|  |  | 
|  | ~DevToolsHttpHandler(); | 
|  |  | 
|  | private: | 
|  | friend class ServerWrapper; | 
|  | friend void ServerStartedOnUI( | 
|  | base::WeakPtr<DevToolsHttpHandler> handler, | 
|  | base::Thread* thread, | 
|  | ServerWrapper* server_wrapper, | 
|  | DevToolsSocketFactory* socket_factory, | 
|  | std::unique_ptr<net::IPEndPoint> ip_address); | 
|  |  | 
|  | void OnJsonRequest(int connection_id, | 
|  | const net::HttpServerRequestInfo& info); | 
|  | void RespondToJsonList(int connection_id, | 
|  | const std::string& host, | 
|  | DevToolsAgentHost::List agent_hosts, | 
|  | bool for_tab); | 
|  | void OnDiscoveryPageRequest(int connection_id); | 
|  | void OnFrontendResourceRequest(int connection_id, const std::string& path); | 
|  | void OnWebSocketRequest(int connection_id, | 
|  | const net::HttpServerRequestInfo& info); | 
|  | void OnWebSocketMessage(int connection_id, std::string data); | 
|  | void OnClose(int connection_id); | 
|  |  | 
|  | void ServerStarted(std::unique_ptr<base::Thread> thread, | 
|  | std::unique_ptr<ServerWrapper> server_wrapper, | 
|  | std::unique_ptr<DevToolsSocketFactory> socket_factory, | 
|  | std::unique_ptr<net::IPEndPoint> ip_address); | 
|  |  | 
|  | void SendJson(int connection_id, | 
|  | net::HttpStatusCode status_code, | 
|  | std::optional<base::ValueView> value, | 
|  | const std::string& message); | 
|  | void Send200(int connection_id, | 
|  | const std::string& data, | 
|  | const std::string& mime_type); | 
|  | void Send404(int connection_id); | 
|  | void Send403(int connection_id, const std::string& message); | 
|  | void Send500(int connection_id, | 
|  | const std::string& message); | 
|  | void AcceptWebSocket(int connection_id, | 
|  | const net::HttpServerRequestInfo& request); | 
|  |  | 
|  | void DecompressAndSendJsonProtocol(int connection_id); | 
|  |  | 
|  | // Returns the front end url without the host at the beginning. | 
|  | std::string GetFrontendURLInternal( | 
|  | scoped_refptr<DevToolsAgentHost> agent_host, | 
|  | const std::string& target_id, | 
|  | const std::string& host); | 
|  |  | 
|  | base::Value::Dict SerializeDescriptor( | 
|  | scoped_refptr<DevToolsAgentHost> agent_host, | 
|  | const std::string& host); | 
|  |  | 
|  | std::set<std::string> remote_allow_origins_; | 
|  | // The thread used by the devtools handler to run server socket. | 
|  | std::unique_ptr<base::Thread> thread_; | 
|  | std::string browser_guid_; | 
|  | std::unique_ptr<ServerWrapper> server_wrapper_; | 
|  | std::unique_ptr<net::IPEndPoint> server_ip_address_; | 
|  | using ConnectionToClientMap = | 
|  | std::map<int, std::unique_ptr<DevToolsAgentHostClientImpl>>; | 
|  | ConnectionToClientMap connection_to_client_; | 
|  | raw_ptr<DevToolsManagerDelegate> delegate_; | 
|  | std::unique_ptr<DevToolsSocketFactory> socket_factory_; | 
|  | base::WeakPtrFactory<DevToolsHttpHandler> weak_factory_{this}; | 
|  | }; | 
|  |  | 
|  | }  // namespace content | 
|  |  | 
|  | #endif  // CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_HTTP_HANDLER_H_ |