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 20 namespace rtc { 21 22 class 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 31 class 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 61 class 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. 85 class SocksProxyServer : public ProxyServer { 86 public: SocksProxyServer(SocketFactory * int_factory,const SocketAddress & int_addr,SocketFactory * ext_factory,const SocketAddress & ext_ip)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