- add sources.
[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   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                          scoped_ptr<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_ptr<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_