http_listen_socket.h revision 3345a6884c488ff3a535c2c9acdd33d74b37e311
1// Copyright (c) 2010 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_BASE_TOOLS_HTTP_LISTEN_SOCKET_H_ 6#define NET_BASE_TOOLS_HTTP_LISTEN_SOCKET_H_ 7#pragma once 8 9#include "base/message_loop.h" 10#include "net/base/listen_socket.h" 11 12class HttpServerRequestInfo; 13class HttpServerResponseInfo; 14 15// Implements a simple HTTP listen socket on top of the raw socket interface. 16class HttpListenSocket : public ListenSocket, 17 public ListenSocket::ListenSocketDelegate { 18 public: 19 class Delegate { 20 public: 21 virtual void OnRequest(HttpListenSocket* connection, 22 HttpServerRequestInfo* info) = 0; 23 24 protected: 25 virtual ~Delegate() {} 26 }; 27 28 static HttpListenSocket* Listen(const std::string& ip, int port, 29 HttpListenSocket::Delegate* delegate); 30 31 void Listen() { ListenSocket::Listen(); } 32 virtual void Accept(); 33 34 // Send a server response. 35 // TODO(mbelshe): make this capable of non-ascii data. 36 void Respond(HttpServerResponseInfo* info, std::string& data); 37 38 // ListenSocketDelegate 39 virtual void DidAccept(ListenSocket* server, ListenSocket* connection); 40 virtual void DidRead(ListenSocket* connection, const char* data, int len); 41 virtual void DidClose(ListenSocket* sock); 42 43 private: 44 friend class base::RefCountedThreadSafe<ListenSocket>; 45 46 static const int kReadBufSize = 16 * 1024; 47 HttpListenSocket(SOCKET s, HttpListenSocket::Delegate* del); 48 virtual ~HttpListenSocket(); 49 50 // Expects the raw data to be stored in recv_data_. If parsing is successful, 51 // will remove the data parsed from recv_data_, leaving only the unused 52 // recv data. 53 HttpServerRequestInfo* ParseHeaders(); 54 55 HttpListenSocket::Delegate* delegate_; 56 std::string recv_data_; 57 58 DISALLOW_COPY_AND_ASSIGN(HttpListenSocket); 59}; 60 61#endif // NET_BASE_TOOLS_HTTP_LISTEN_SOCKET_H_ 62