15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved.
25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be
35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file.
45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#ifndef MOJO_SPY_WEBSOCKET_SERVER_H_
65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#define MOJO_SPY_WEBSOCKET_SERVER_H_
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <string>
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/spy/common.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/spy/public/spy.mojom.h"
125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "net/server/http_server.h"
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace base {
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass Time;
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass GURL;
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace mojo {
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass WebSocketServer : public net::HttpServer::Delegate,
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        public spy_api::SpyClient {
245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public:
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Pass 0 in |port| to listen in one available port.
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  explicit WebSocketServer(int port, ScopedMessagePipeHandle server_pipe);
275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual ~WebSocketServer();
285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Begin accepting HTTP requests. Must be called from an IO MessageLoop.
295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bool Start();
305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Returns the listening port, useful if 0 was passed to the contructor.
315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  int port() const { return port_; }
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Maintains a log of the message passed in.
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void LogMessageInfo(
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const mojo::MojoRequestHeader& message_header,
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const GURL& url,
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const base::Time& message_time);
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu protected:
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Overridden from net::HttpServer::Delegate.
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnConnect(int connection_id) OVERRIDE {}
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void OnHttpRequest(
435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      int connection_id,
445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const net::HttpServerRequestInfo& info) OVERRIDE;
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void OnWebSocketRequest(
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      int connection_id,
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const net::HttpServerRequestInfo& info) OVERRIDE;
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void OnWebSocketMessage(
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      int connection_id,
505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const std::string& data) OVERRIDE;
515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void OnClose(int connection_id) OVERRIDE;
525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Overriden form spy_api::SpyClient.
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnFatalError(spy_api::Result result) OVERRIDE;
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnSessionEnd(spy_api::Result result) OVERRIDE;
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnClientConnection(
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const mojo::String& name,
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      uint32_t id,
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      spy_api::ConnectionOptions options) OVERRIDE;
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnMessage(spy_api::MessagePtr message) OVERRIDE;
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Callbacks from calling spy_api::SpyServer.
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void OnStartSession(spy_api::Result, mojo::String);
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool Connected() const;
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private:
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  int port_;
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  int connection_id_;
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<net::HttpServer> web_server_;
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  spy_api::SpyServerPtr spy_server_;
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DISALLOW_COPY_AND_ASSIGN(WebSocketServer);
745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu};
755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace mojo
775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif  // MOJO_SPY_WEBSOCKET_SERVER_H_
79