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