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