http_listen_socket.h revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NET_BASE_TOOLS_HTTP_LISTEN_SOCKET_H_ 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NET_BASE_TOOLS_HTTP_LISTEN_SOCKET_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/message_loop.h" 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/listen_socket.h" 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass HttpServerRequestInfo; 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass HttpServerResponseInfo; 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Implements a simple HTTP listen socket on top of the raw socket interface. 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass HttpListenSocket : public ListenSocket, 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public ListenSocket::ListenSocketDelegate { 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott class Delegate { 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnRequest(HttpListenSocket* connection, 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HttpServerRequestInfo* info) = 0; 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected: 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual ~Delegate() {} 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static HttpListenSocket* Listen(const std::string& ip, int port, 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HttpListenSocket::Delegate* delegate); 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual void Listen(); 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void Accept(); 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Send a server response. 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // TODO(mbelshe): make this capable of non-ascii data. 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void Respond(HttpServerResponseInfo* info, std::string& data); 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // ListenSocketDelegate 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void DidAccept(ListenSocket* server, ListenSocket* connection); 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void DidRead(ListenSocket* connection, const char* data, int len); 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void DidClose(ListenSocket* sock); 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott friend class base::RefCountedThreadSafe<ListenSocket>; 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static const int kReadBufSize = 16 * 1024; 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HttpListenSocket(SOCKET s, HttpListenSocket::Delegate* del); 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual ~HttpListenSocket(); 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Expects the raw data to be stored in recv_data_. If parsing is successful, 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // will remove the data parsed from recv_data_, leaving only the unused 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // recv data. 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HttpServerRequestInfo* ParseHeaders(); 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HttpListenSocket::Delegate* delegate_; 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string recv_data_; 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(HttpListenSocket); 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // NET_BASE_TOOLS_HTTP_LISTEN_SOCKET_H_ 62