1/*
2 *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef WEBRTC_BASE_PROXYSERVER_H_
12#define WEBRTC_BASE_PROXYSERVER_H_
13
14#include <list>
15#include "webrtc/base/asyncsocket.h"
16#include "webrtc/base/socketadapters.h"
17#include "webrtc/base/socketaddress.h"
18#include "webrtc/base/stream.h"
19
20namespace rtc {
21
22class SocketFactory;
23
24// ProxyServer is a base class that allows for easy construction of proxy
25// servers. With its helper class ProxyBinding, it contains all the necessary
26// logic for receiving and bridging connections. The specific client-server
27// proxy protocol is implemented by an instance of the AsyncProxyServerSocket
28// class; children of ProxyServer implement WrapSocket appropriately to return
29// the correct protocol handler.
30
31class ProxyBinding : public sigslot::has_slots<> {
32 public:
33  ProxyBinding(AsyncProxyServerSocket* in_socket, AsyncSocket* out_socket);
34  ~ProxyBinding() override;
35  sigslot::signal1<ProxyBinding*> SignalDestroyed;
36
37 private:
38  void OnConnectRequest(AsyncProxyServerSocket* socket,
39                        const SocketAddress& addr);
40  void OnInternalRead(AsyncSocket* socket);
41  void OnInternalWrite(AsyncSocket* socket);
42  void OnInternalClose(AsyncSocket* socket, int err);
43  void OnExternalConnect(AsyncSocket* socket);
44  void OnExternalRead(AsyncSocket* socket);
45  void OnExternalWrite(AsyncSocket* socket);
46  void OnExternalClose(AsyncSocket* socket, int err);
47
48  static void Read(AsyncSocket* socket, FifoBuffer* buffer);
49  static void Write(AsyncSocket* socket, FifoBuffer* buffer);
50  void Destroy();
51
52  static const int kBufferSize = 4096;
53  scoped_ptr<AsyncProxyServerSocket> int_socket_;
54  scoped_ptr<AsyncSocket> ext_socket_;
55  bool connected_;
56  FifoBuffer out_buffer_;
57  FifoBuffer in_buffer_;
58  RTC_DISALLOW_COPY_AND_ASSIGN(ProxyBinding);
59};
60
61class ProxyServer : public sigslot::has_slots<> {
62 public:
63  ProxyServer(SocketFactory* int_factory, const SocketAddress& int_addr,
64              SocketFactory* ext_factory, const SocketAddress& ext_ip);
65  ~ProxyServer() override;
66
67  // Returns the address to which the proxy server is bound
68  SocketAddress GetServerAddress();
69
70 protected:
71  void OnAcceptEvent(AsyncSocket* socket);
72  virtual AsyncProxyServerSocket* WrapSocket(AsyncSocket* socket) = 0;
73  void OnBindingDestroyed(ProxyBinding* binding);
74
75 private:
76  typedef std::list<ProxyBinding*> BindingList;
77  SocketFactory* ext_factory_;
78  SocketAddress ext_ip_;
79  scoped_ptr<AsyncSocket> server_socket_;
80  BindingList bindings_;
81  RTC_DISALLOW_COPY_AND_ASSIGN(ProxyServer);
82};
83
84// SocksProxyServer is a simple extension of ProxyServer to implement SOCKS.
85class SocksProxyServer : public ProxyServer {
86 public:
87  SocksProxyServer(SocketFactory* int_factory, const SocketAddress& int_addr,
88                   SocketFactory* ext_factory, const SocketAddress& ext_ip)
89      : ProxyServer(int_factory, int_addr, ext_factory, ext_ip) {
90  }
91 protected:
92  AsyncProxyServerSocket* WrapSocket(AsyncSocket* socket) override;
93  RTC_DISALLOW_COPY_AND_ASSIGN(SocksProxyServer);
94};
95
96}  // namespace rtc
97
98#endif  // WEBRTC_BASE_PROXYSERVER_H_
99