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