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