Index: net/server/http_server.h |
diff --git a/net/server/http_server.h b/net/server/http_server.h |
index 4309d122f1ead040eb28f2c2557a489b9fbff1b6..2ae698b98c5329424e31b2b2bfab616fad85c3ac 100644 |
--- a/net/server/http_server.h |
+++ b/net/server/http_server.h |
@@ -5,13 +5,14 @@ |
#ifndef NET_SERVER_HTTP_SERVER_H_ |
#define NET_SERVER_HTTP_SERVER_H_ |
-#include <list> |
#include <map> |
+#include <string> |
#include "base/basictypes.h" |
+#include "base/macros.h" |
#include "base/memory/scoped_ptr.h" |
+#include "base/memory/weak_ptr.h" |
#include "net/http/http_status_code.h" |
-#include "net/socket/stream_listen_socket.h" |
namespace net { |
@@ -19,30 +20,28 @@ class HttpConnection; |
class HttpServerRequestInfo; |
class HttpServerResponseInfo; |
class IPEndPoint; |
+class ServerSocket; |
+class StreamSocket; |
class WebSocket; |
-class HttpServer : public StreamListenSocket::Delegate, |
- public base::RefCountedThreadSafe<HttpServer> { |
+class HttpServer { |
public: |
+ // Delegate to handle http/websocket events. Beware that it is not safe to |
+ // destroy the HttpServer in any of these callbacks. |
class Delegate { |
public: |
virtual void OnHttpRequest(int connection_id, |
const HttpServerRequestInfo& info) = 0; |
- |
virtual void OnWebSocketRequest(int connection_id, |
const HttpServerRequestInfo& info) = 0; |
- |
virtual void OnWebSocketMessage(int connection_id, |
const std::string& data) = 0; |
- |
virtual void OnClose(int connection_id) = 0; |
- |
- protected: |
- virtual ~Delegate() {} |
}; |
- HttpServer(const StreamListenSocketFactory& socket_factory, |
+ HttpServer(scoped_ptr<ServerSocket> server_socket, |
HttpServer::Delegate* delegate); |
+ ~HttpServer(); |
void AcceptWebSocket(int connection_id, |
const HttpServerRequestInfo& request); |
@@ -51,6 +50,7 @@ class HttpServer : public StreamListenSocket::Delegate, |
// performed that data constitutes a valid HTTP response. A valid HTTP |
// response may be split across multiple calls to SendRaw. |
void SendRaw(int connection_id, const std::string& data); |
+ // TODO(byungchul): Consider replacing function name with SendResponseInfo |
void SendResponse(int connection_id, const HttpServerResponseInfo& response); |
void Send(int connection_id, |
HttpStatusCode status_code, |
@@ -64,40 +64,50 @@ class HttpServer : public StreamListenSocket::Delegate, |
void Close(int connection_id); |
+ void SetReceiveBufferSize(int connection_id, int32 size); |
+ void SetSendBufferSize(int connection_id, int32 size); |
+ |
// Copies the local address to |address|. Returns a network error code. |
int GetLocalAddress(IPEndPoint* address); |
- // ListenSocketDelegate |
- virtual void DidAccept(StreamListenSocket* server, |
- scoped_ptr<StreamListenSocket> socket) OVERRIDE; |
- virtual void DidRead(StreamListenSocket* socket, |
- const char* data, |
- int len) OVERRIDE; |
- virtual void DidClose(StreamListenSocket* socket) OVERRIDE; |
+ private: |
+ friend class HttpServerTest; |
+ |
+ typedef std::map<int, HttpConnection*> IdToConnectionMap; |
- protected: |
- virtual ~HttpServer(); |
+ void DoAcceptLoop(); |
+ void OnAcceptCompleted(int rv); |
+ int HandleAcceptResult(int rv); |
- private: |
- friend class base::RefCountedThreadSafe<HttpServer>; |
- friend class HttpConnection; |
+ void DoReadLoop(HttpConnection* connection); |
+ void OnReadCompleted(int connection_id, int rv); |
+ int HandleReadResult(HttpConnection* connection, int rv); |
+ |
+ void DoWriteLoop(HttpConnection* connection); |
+ void OnWriteCompleted(int connection_id, int rv); |
+ int HandleWriteResult(HttpConnection* connection, int rv); |
// Expects the raw data to be stored in recv_data_. If parsing is successful, |
// will remove the data parsed from recv_data_, leaving only the unused |
// recv data. |
- bool ParseHeaders(HttpConnection* connection, |
+ bool ParseHeaders(const char* data, |
+ size_t data_len, |
HttpServerRequestInfo* info, |
size_t* pos); |
HttpConnection* FindConnection(int connection_id); |
- HttpConnection* FindConnection(StreamListenSocket* socket); |
- HttpServer::Delegate* delegate_; |
- scoped_ptr<StreamListenSocket> server_; |
- typedef std::map<int, HttpConnection*> IdToConnectionMap; |
+ // Whether or not Close() has been called during delegate callback processing. |
+ bool HasClosedConnection(HttpConnection* connection); |
+ |
+ const scoped_ptr<ServerSocket> server_socket_; |
+ scoped_ptr<StreamSocket> accepted_socket_; |
+ HttpServer::Delegate* const delegate_; |
+ |
+ int last_id_; |
IdToConnectionMap id_to_connection_; |
- typedef std::map<StreamListenSocket*, HttpConnection*> SocketToConnectionMap; |
- SocketToConnectionMap socket_to_connection_; |
+ |
+ base::WeakPtrFactory<HttpServer> weak_ptr_factory_; |
DISALLOW_COPY_AND_ASSIGN(HttpServer); |
}; |