blob: d90b09171c4984f0126057b57f6b9922e96f5a80 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef RTC_BASE_PROXYSERVER_H_
12#define RTC_BASE_PROXYSERVER_H_
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000013
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020014#include <list>
15#include <memory>
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "rtc_base/asyncsocket.h"
17#include "rtc_base/constructormagic.h"
18#include "rtc_base/socketadapters.h"
19#include "rtc_base/socketaddress.h"
20#include "rtc_base/stream.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000021
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020022namespace rtc {
23
24class SocketFactory;
25
26// ProxyServer is a base class that allows for easy construction of proxy
27// servers. With its helper class ProxyBinding, it contains all the necessary
28// logic for receiving and bridging connections. The specific client-server
29// proxy protocol is implemented by an instance of the AsyncProxyServerSocket
30// class; children of ProxyServer implement WrapSocket appropriately to return
31// the correct protocol handler.
32
33class ProxyBinding : public sigslot::has_slots<> {
34 public:
35 ProxyBinding(AsyncProxyServerSocket* in_socket, AsyncSocket* out_socket);
36 ~ProxyBinding() override;
37 sigslot::signal1<ProxyBinding*> SignalDestroyed;
38
39 private:
40 void OnConnectRequest(AsyncProxyServerSocket* socket,
41 const SocketAddress& addr);
42 void OnInternalRead(AsyncSocket* socket);
43 void OnInternalWrite(AsyncSocket* socket);
44 void OnInternalClose(AsyncSocket* socket, int err);
45 void OnExternalConnect(AsyncSocket* socket);
46 void OnExternalRead(AsyncSocket* socket);
47 void OnExternalWrite(AsyncSocket* socket);
48 void OnExternalClose(AsyncSocket* socket, int err);
49
50 static void Read(AsyncSocket* socket, FifoBuffer* buffer);
51 static void Write(AsyncSocket* socket, FifoBuffer* buffer);
52 void Destroy();
53
54 static const int kBufferSize = 4096;
55 std::unique_ptr<AsyncProxyServerSocket> int_socket_;
56 std::unique_ptr<AsyncSocket> ext_socket_;
57 bool connected_;
58 FifoBuffer out_buffer_;
59 FifoBuffer in_buffer_;
60 RTC_DISALLOW_COPY_AND_ASSIGN(ProxyBinding);
61};
62
63class ProxyServer : public sigslot::has_slots<> {
64 public:
65 ProxyServer(SocketFactory* int_factory, const SocketAddress& int_addr,
66 SocketFactory* ext_factory, const SocketAddress& ext_ip);
67 ~ProxyServer() override;
68
69 // Returns the address to which the proxy server is bound
70 SocketAddress GetServerAddress();
71
72 protected:
73 void OnAcceptEvent(AsyncSocket* socket);
74 virtual AsyncProxyServerSocket* WrapSocket(AsyncSocket* socket) = 0;
75 void OnBindingDestroyed(ProxyBinding* binding);
76
77 private:
78 typedef std::list<ProxyBinding*> BindingList;
79 SocketFactory* ext_factory_;
80 SocketAddress ext_ip_;
81 std::unique_ptr<AsyncSocket> server_socket_;
82 BindingList bindings_;
83 RTC_DISALLOW_COPY_AND_ASSIGN(ProxyServer);
84};
85
86// SocksProxyServer is a simple extension of ProxyServer to implement SOCKS.
87class SocksProxyServer : public ProxyServer {
88 public:
89 SocksProxyServer(SocketFactory* int_factory, const SocketAddress& int_addr,
90 SocketFactory* ext_factory, const SocketAddress& ext_ip)
91 : ProxyServer(int_factory, int_addr, ext_factory, ext_ip) {
92 }
93 protected:
94 AsyncProxyServerSocket* WrapSocket(AsyncSocket* socket) override;
95 RTC_DISALLOW_COPY_AND_ASSIGN(SocksProxyServer);
96};
97
98} // namespace rtc
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000099
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200100#endif // RTC_BASE_PROXYSERVER_H_