| // 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 "content/public/browser/devtools_manager_delegate.h" | |
| #include "net/base/ip_endpoint.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, | |
| DevToolsAgentHost::RemoteDebuggingServerMode mode = | |
| DevToolsAgentHost::RemoteDebuggingServerMode::kDefault); | |
| DevToolsHttpHandler(const DevToolsHttpHandler&) = delete; | |
| DevToolsHttpHandler& operator=(const DevToolsHttpHandler&) = delete; | |
| ~DevToolsHttpHandler(); | |
| net::IPEndPoint GetServerIpAddress() const; | |
| private: | |
| friend class ServerWrapper; | |
| friend void ServerStartedOnUI(base::WeakPtr<DevToolsHttpHandler> handler, | |
| std::unique_ptr<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, std::string_view 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, | |
| std::string_view message); | |
| void Send200(int connection_id, | |
| std::string_view data, | |
| std::string_view 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 HandleDebuggingApproval( | |
| int connection_id, | |
| const net::HttpServerRequestInfo& request, | |
| DevToolsManagerDelegate::AcceptConnectionResult result); | |
| 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::DictValue SerializeDescriptor( | |
| scoped_refptr<DevToolsAgentHost> agent_host, | |
| const std::string& host); | |
| DevToolsAgentHost::RemoteDebuggingServerMode mode_; | |
| 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_ |