1// Copyright (c) 2012 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. 4 5#ifndef NET_SERVER_HTTP_SERVER_H_ 6#define NET_SERVER_HTTP_SERVER_H_ 7 8#include <list> 9#include <map> 10 11#include "base/basictypes.h" 12#include "base/memory/ref_counted.h" 13#include "net/http/http_status_code.h" 14#include "net/socket/stream_listen_socket.h" 15 16namespace net { 17 18class HttpConnection; 19class HttpServerRequestInfo; 20class HttpServerResponseInfo; 21class IPEndPoint; 22class WebSocket; 23 24class HttpServer : public StreamListenSocket::Delegate, 25 public base::RefCountedThreadSafe<HttpServer> { 26 public: 27 class Delegate { 28 public: 29 virtual void OnHttpRequest(int connection_id, 30 const HttpServerRequestInfo& info) = 0; 31 32 virtual void OnWebSocketRequest(int connection_id, 33 const HttpServerRequestInfo& info) = 0; 34 35 virtual void OnWebSocketMessage(int connection_id, 36 const std::string& data) = 0; 37 38 virtual void OnClose(int connection_id) = 0; 39 40 protected: 41 virtual ~Delegate() {} 42 }; 43 44 HttpServer(const StreamListenSocketFactory& socket_factory, 45 HttpServer::Delegate* delegate); 46 47 void AcceptWebSocket(int connection_id, 48 const HttpServerRequestInfo& request); 49 void SendOverWebSocket(int connection_id, const std::string& data); 50 void SendResponse(int connection_id, const HttpServerResponseInfo& response); 51 void Send(int connection_id, 52 HttpStatusCode status_code, 53 const std::string& data, 54 const std::string& mime_type); 55 void Send200(int connection_id, 56 const std::string& data, 57 const std::string& mime_type); 58 void Send404(int connection_id); 59 void Send500(int connection_id, const std::string& message); 60 61 void Close(int connection_id); 62 63 // Copies the local address to |address|. Returns a network error code. 64 int GetLocalAddress(IPEndPoint* address); 65 66 // ListenSocketDelegate 67 virtual void DidAccept(StreamListenSocket* server, 68 StreamListenSocket* socket) OVERRIDE; 69 virtual void DidRead(StreamListenSocket* socket, 70 const char* data, 71 int len) OVERRIDE; 72 virtual void DidClose(StreamListenSocket* socket) OVERRIDE; 73 74 protected: 75 virtual ~HttpServer(); 76 77 private: 78 friend class base::RefCountedThreadSafe<HttpServer>; 79 friend class HttpConnection; 80 81 // Expects the raw data to be stored in recv_data_. If parsing is successful, 82 // will remove the data parsed from recv_data_, leaving only the unused 83 // recv data. 84 bool ParseHeaders(HttpConnection* connection, 85 HttpServerRequestInfo* info, 86 size_t* pos); 87 88 HttpConnection* FindConnection(int connection_id); 89 HttpConnection* FindConnection(StreamListenSocket* socket); 90 91 HttpServer::Delegate* delegate_; 92 scoped_refptr<StreamListenSocket> server_; 93 typedef std::map<int, HttpConnection*> IdToConnectionMap; 94 IdToConnectionMap id_to_connection_; 95 typedef std::map<StreamListenSocket*, HttpConnection*> SocketToConnectionMap; 96 SocketToConnectionMap socket_to_connection_; 97 98 DISALLOW_COPY_AND_ASSIGN(HttpServer); 99}; 100 101} // namespace net 102 103#endif // NET_SERVER_HTTP_SERVER_H_ 104