1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "mojo/spy/websocket_server.h"
8 #include "base/strings/stringprintf.h"
9 #include "net/base/ip_endpoint.h"
10 #include "net/base/net_errors.h"
11 #include "net/server/http_server_request_info.h"
12 #include "net/server/http_server_response_info.h"
13 #include "net/socket/tcp_listen_socket.h"
17 const int kNotConnected
= -1;
19 WebSocketServer::WebSocketServer(int port
)
20 : port_(port
), connection_id_(kNotConnected
) {
23 WebSocketServer::~WebSocketServer() {
26 bool WebSocketServer::Start() {
27 net::TCPListenSocketFactory
factory("0.0.0.0", port_
);
28 server_
= new net::HttpServer(factory
, this);
29 net::IPEndPoint address
;
30 int error
= server_
->GetLocalAddress(&address
);
31 port_
= address
.port();
32 return (error
== net::OK
);
35 void WebSocketServer::OnHttpRequest(
37 const net::HttpServerRequestInfo
& info
) {
38 server_
->Send500(connection_id
, "websockets protocol only");
41 void WebSocketServer::OnWebSocketRequest(
43 const net::HttpServerRequestInfo
& info
) {
44 if (connection_id_
!= kNotConnected
) {
45 // Reject connection since we already have our client.
46 base::MessageLoop::current()->PostTask(
48 base::Bind(&net::HttpServer::Close
, server_
, connection_id
));
51 // Accept the connection.
52 server_
->AcceptWebSocket(connection_id
, info
);
53 connection_id_
= connection_id
;
56 void WebSocketServer::OnWebSocketMessage(
58 const std::string
& data
) {
59 // TODO(cpu): remove this test code soon.
60 if (data
== "\"hello\"")
61 server_
->SendOverWebSocket(connection_id
, "\"hi there!\"");
64 void WebSocketServer::OnClose(
66 if (connection_id
== connection_id_
)
67 connection_id_
= kNotConnected
;