Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / net / server / http_server.h
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_