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