// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "mojo/spy/websocket_server.h" #include "base/bind.h" #include "base/strings/stringprintf.h" #include "net/base/ip_endpoint.h" #include "net/base/net_errors.h" #include "net/server/http_server_request_info.h" #include "net/server/http_server_response_info.h" #include "net/socket/tcp_listen_socket.h" namespace spy { const int kNotConnected = -1; WebSocketServer::WebSocketServer(int port) : port_(port), connection_id_(kNotConnected) { } WebSocketServer::~WebSocketServer() { } bool WebSocketServer::Start() { net::TCPListenSocketFactory factory("0.0.0.0", port_); server_ = new net::HttpServer(factory, this); net::IPEndPoint address; int error = server_->GetLocalAddress(&address); port_ = address.port(); return (error == net::OK); } void WebSocketServer::OnHttpRequest( int connection_id, const net::HttpServerRequestInfo& info) { server_->Send500(connection_id, "websockets protocol only"); } void WebSocketServer::OnWebSocketRequest( int connection_id, const net::HttpServerRequestInfo& info) { if (connection_id_ != kNotConnected) { // Reject connection since we already have our client. base::MessageLoop::current()->PostTask( FROM_HERE, base::Bind(&net::HttpServer::Close, server_, connection_id)); return; } // Accept the connection. server_->AcceptWebSocket(connection_id, info); connection_id_ = connection_id; } void WebSocketServer::OnWebSocketMessage( int connection_id, const std::string& data) { // TODO(cpu): remove this test code soon. if (data == "\"hello\"") server_->SendOverWebSocket(connection_id, "\"hi there!\""); } void WebSocketServer::OnClose( int connection_id) { if (connection_id == connection_id_) connection_id_ = kNotConnected; } } // namespace spy