devtools_http_handler_impl.h revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
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" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/devtools_http_handler.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/devtools_http_handler_delegate.h" 18a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "net/http/http_status_code.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/server/http_server.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryValue; 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ListValue; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Thread; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Value; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StreamListenSocketFactory; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestContextGetter; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DevToolsBrowserTarget; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DevToolsClientHost; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DevToolsHttpHandlerImpl 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public DevToolsHttpHandler, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public base::RefCountedThreadSafe<DevToolsHttpHandlerImpl>, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public net::HttpServer::Delegate { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCountedThreadSafe<DevToolsHttpHandlerImpl>; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class DevToolsHttpHandler; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Takes ownership over |socket_factory|. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DevToolsHttpHandlerImpl(const net::StreamListenSocketFactory* 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. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnHttpRequest(int connection_id, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpServerRequestInfo& info) OVERRIDE; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnWebSocketRequest( 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int connection_id, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpServerRequestInfo& info) OVERRIDE; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnWebSocketMessage(int connection_id, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& data) OVERRIDE; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnClose(int connection_id) OVERRIDE; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnJsonRequestUI(int connection_id, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpServerRequestInfo& info); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnThumbnailRequestUI(int connection_id, const GURL& page_url); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnDiscoveryPageRequestUI(int connection_id); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnWebSocketRequestUI(int connection_id, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpServerRequestInfo& info); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnWebSocketMessageUI(int connection_id, const std::string& data); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnCloseUI(int connection_id); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ResetHandlerThread(); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ResetHandlerThreadAndRelease(); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void OnTargetListReceived( 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int connection_id, 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& host, 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const DevToolsHttpHandlerDelegate::TargetList& targets); 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DevToolsTarget* GetTarget(const std::string& id); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Init(); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Teardown(); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void StartHandlerThread(); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void StopHandlerThread(); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void WriteActivePortToUserProfile(); 9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SendJson(int connection_id, 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::HttpStatusCode status_code, 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* value, 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& message); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Send200(int connection_id, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& data, 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& mime_type); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Send404(int connection_id); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Send500(int connection_id, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& message); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AcceptWebSocket(int connection_id, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpServerRequestInfo& request); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the front end url without the host at the beginning. 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string GetFrontendURLInternal(const std::string target_id, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& host); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::DictionaryValue* SerializeTarget(const DevToolsTarget& target, 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& host); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The thread used by the devtools handler to run server socket. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Thread> thread_; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string frontend_url_; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<const net::StreamListenSocketFactory> socket_factory_; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::HttpServer> server_; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<int, DevToolsClientHost*> ConnectionToClientHostMap; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConnectionToClientHostMap connection_to_client_host_ui_; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DevToolsHttpHandlerDelegate> delegate_; 12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::FilePath active_port_output_directory_; 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) typedef std::map<std::string, DevToolsTarget*> TargetMap; 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) TargetMap target_map_; 1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<DevToolsBrowserTarget> browser_target_; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DevToolsHttpHandlerImpl); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_HTTP_HANDLER_IMPL_H_ 135