• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
~Delegate()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