Home | History | Annotate | Download | only in base
      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:
     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