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