#ifndef CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_HTTP_HANDLER_IMPL_H_
#define CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_HTTP_HANDLER_IMPL_H_
#include <map>
#include <set>
#include <string>
#include <vector>
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "content/common/content_export.h"
#include "content/public/browser/devtools_http_handler.h"
#include "content/public/browser/devtools_http_handler_delegate.h"
#include "net/http/http_status_code.h"
#include "net/server/http_server.h"
namespace base {
class DictionaryValue;
class ListValue;
class Thread;
class Value;
}
namespace net {
class StreamListenSocketFactory;
class URLRequestContextGetter;
}
namespace content {
class DevToolsBrowserTarget;
class DevToolsClientHost;
class DevToolsHttpHandlerImpl
: public DevToolsHttpHandler,
public base::RefCountedThreadSafe<DevToolsHttpHandlerImpl>,
public net::HttpServer::Delegate {
private:
friend class base::RefCountedThreadSafe<DevToolsHttpHandlerImpl>;
friend class DevToolsHttpHandler;
DevToolsHttpHandlerImpl(const net::StreamListenSocketFactory* socket_factory,
const std::string& frontend_url,
DevToolsHttpHandlerDelegate* delegate);
virtual ~DevToolsHttpHandlerImpl();
void Start();
virtual void Stop() OVERRIDE;
virtual GURL GetFrontendURL() OVERRIDE;
virtual void OnHttpRequest(int connection_id,
const net::HttpServerRequestInfo& info) OVERRIDE;
virtual void OnWebSocketRequest(
int connection_id,
const net::HttpServerRequestInfo& info) OVERRIDE;
virtual void OnWebSocketMessage(int connection_id,
const std::string& data) OVERRIDE;
virtual void OnClose(int connection_id) OVERRIDE;
void OnJsonRequestUI(int connection_id,
const net::HttpServerRequestInfo& info);
void OnThumbnailRequestUI(int connection_id, const GURL& page_url);
void OnDiscoveryPageRequestUI(int connection_id);
void OnWebSocketRequestUI(int connection_id,
const net::HttpServerRequestInfo& info);
void OnWebSocketMessageUI(int connection_id, const std::string& data);
void OnCloseUI(int connection_id);
void ResetHandlerThread();
void ResetHandlerThreadAndRelease();
void OnTargetListReceived(
int connection_id,
const std::string& host,
const DevToolsHttpHandlerDelegate::TargetList& targets);
DevToolsTarget* GetTarget(const std::string& id);
void Init();
void Teardown();
void StartHandlerThread();
void StopHandlerThread();
void SendJson(int connection_id,
net::HttpStatusCode status_code,
base::Value* 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 Send500(int connection_id,
const std::string& message);
void AcceptWebSocket(int connection_id,
const net::HttpServerRequestInfo& request);
std::string GetFrontendURLInternal(const std::string target_id,
const std::string& host);
base::DictionaryValue* SerializeTarget(const DevToolsTarget& target,
const std::string& host);
scoped_ptr<base::Thread> thread_;
std::string frontend_url_;
scoped_ptr<const net::StreamListenSocketFactory> socket_factory_;
scoped_refptr<net::HttpServer> server_;
typedef std::map<int, DevToolsClientHost*> ConnectionToClientHostMap;
ConnectionToClientHostMap connection_to_client_host_ui_;
scoped_ptr<DevToolsHttpHandlerDelegate> delegate_;
typedef std::map<std::string, DevToolsTarget*> TargetMap;
TargetMap target_map_;
scoped_refptr<DevToolsBrowserTarget> browser_target_;
DISALLOW_COPY_AND_ASSIGN(DevToolsHttpHandlerImpl);
};
}
#endif