Home | History | Annotate | Download | only in server
      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/scoped_ptr.h"
     13 #include "net/http/http_status_code.h"
     14 #include "net/socket/stream_listen_socket.h"
     15 
     16 namespace net {
     17 
     18 class HttpConnection;
     19 class HttpServerRequestInfo;
     20 class HttpServerResponseInfo;
     21 class IPEndPoint;
     22 class WebSocket;
     23 
     24 class 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   // Sends the provided data directly to the given connection. No validation is
     51   // performed that data constitutes a valid HTTP response. A valid HTTP
     52   // response may be split across multiple calls to SendRaw.
     53   void SendRaw(int connection_id, const std::string& data);
     54   void SendResponse(int connection_id, const HttpServerResponseInfo& response);
     55   void Send(int connection_id,
     56             HttpStatusCode status_code,
     57             const std::string& data,
     58             const std::string& mime_type);
     59   void Send200(int connection_id,
     60                const std::string& data,
     61                const std::string& mime_type);
     62   void Send404(int connection_id);
     63   void Send500(int connection_id, const std::string& message);
     64 
     65   void Close(int connection_id);
     66 
     67   // Copies the local address to |address|. Returns a network error code.
     68   int GetLocalAddress(IPEndPoint* address);
     69 
     70   // ListenSocketDelegate
     71   virtual void DidAccept(StreamListenSocket* server,
     72                          scoped_ptr<StreamListenSocket> socket) OVERRIDE;
     73   virtual void DidRead(StreamListenSocket* socket,
     74                        const char* data,
     75                        int len) OVERRIDE;
     76   virtual void DidClose(StreamListenSocket* socket) OVERRIDE;
     77 
     78  protected:
     79   virtual ~HttpServer();
     80 
     81  private:
     82   friend class base::RefCountedThreadSafe<HttpServer>;
     83   friend class HttpConnection;
     84 
     85   // Expects the raw data to be stored in recv_data_. If parsing is successful,
     86   // will remove the data parsed from recv_data_, leaving only the unused
     87   // recv data.
     88   bool ParseHeaders(HttpConnection* connection,
     89                     HttpServerRequestInfo* info,
     90                     size_t* pos);
     91 
     92   HttpConnection* FindConnection(int connection_id);
     93   HttpConnection* FindConnection(StreamListenSocket* socket);
     94 
     95   HttpServer::Delegate* delegate_;
     96   scoped_ptr<StreamListenSocket> server_;
     97   typedef std::map<int, HttpConnection*> IdToConnectionMap;
     98   IdToConnectionMap id_to_connection_;
     99   typedef std::map<StreamListenSocket*, HttpConnection*> SocketToConnectionMap;
    100   SocketToConnectionMap socket_to_connection_;
    101 
    102   DISALLOW_COPY_AND_ASSIGN(HttpServer);
    103 };
    104 
    105 }  // namespace net
    106 
    107 #endif // NET_SERVER_HTTP_SERVER_H_
    108