blob: b18c7a6a65b5cd707135e1eeb372999eedb36abd [file] [log] [blame]
Niels Möller44153152018-12-17 14:04:05 +01001/*
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 RTC_BASE_SERVER_SOCKET_ADAPTERS_H_
12#define RTC_BASE_SERVER_SOCKET_ADAPTERS_H_
13
Steve Anton10542f22019-01-11 09:11:00 -080014#include "rtc_base/socket_adapters.h"
Niels Möller44153152018-12-17 14:04:05 +010015
16namespace rtc {
17
18// Interface for implementing proxy server sockets.
19class AsyncProxyServerSocket : public BufferedReadAdapter {
20 public:
Niels Möllerd0b88792021-08-12 10:32:30 +020021 AsyncProxyServerSocket(Socket* socket, size_t buffer_size);
Niels Möller44153152018-12-17 14:04:05 +010022 ~AsyncProxyServerSocket() override;
23 sigslot::signal2<AsyncProxyServerSocket*, const SocketAddress&>
24 SignalConnectRequest;
25 virtual void SendConnectResult(int err, const SocketAddress& addr) = 0;
26};
27
28// Implements a socket adapter that performs the server side of a
29// fake SSL handshake. Used when implementing a relay server that does "ssltcp".
30class AsyncSSLServerSocket : public BufferedReadAdapter {
31 public:
Niels Möllerd0b88792021-08-12 10:32:30 +020032 explicit AsyncSSLServerSocket(Socket* socket);
Niels Möller44153152018-12-17 14:04:05 +010033
Byoungchan Lee14af7622022-01-12 05:24:58 +090034 AsyncSSLServerSocket(const AsyncSSLServerSocket&) = delete;
35 AsyncSSLServerSocket& operator=(const AsyncSSLServerSocket&) = delete;
36
Niels Möller44153152018-12-17 14:04:05 +010037 protected:
38 void ProcessInput(char* data, size_t* len) override;
Niels Möller44153152018-12-17 14:04:05 +010039};
40
41// Implements a proxy server socket for the SOCKS protocol.
42class AsyncSocksProxyServerSocket : public AsyncProxyServerSocket {
43 public:
Niels Möllerd0b88792021-08-12 10:32:30 +020044 explicit AsyncSocksProxyServerSocket(Socket* socket);
Niels Möller44153152018-12-17 14:04:05 +010045
Byoungchan Lee14af7622022-01-12 05:24:58 +090046 AsyncSocksProxyServerSocket(const AsyncSocksProxyServerSocket&) = delete;
47 AsyncSocksProxyServerSocket& operator=(const AsyncSocksProxyServerSocket&) =
48 delete;
49
Niels Möller44153152018-12-17 14:04:05 +010050 private:
51 void ProcessInput(char* data, size_t* len) override;
52 void DirectSend(const ByteBufferWriter& buf);
53
54 void HandleHello(ByteBufferReader* request);
55 void SendHelloReply(uint8_t method);
56 void HandleAuth(ByteBufferReader* request);
57 void SendAuthReply(uint8_t result);
58 void HandleConnect(ByteBufferReader* request);
59 void SendConnectResult(int result, const SocketAddress& addr) override;
60
61 void Error(int error);
62
63 static const int kBufferSize = 1024;
64 enum State {
65 SS_HELLO,
66 SS_AUTH,
67 SS_CONNECT,
68 SS_CONNECT_PENDING,
69 SS_TUNNEL,
70 SS_ERROR
71 };
72 State state_;
Niels Möller44153152018-12-17 14:04:05 +010073};
74
75} // namespace rtc
76
77#endif // RTC_BASE_SERVER_SOCKET_ADAPTERS_H_