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