blob: e78ee18a27d6d0bc4bb9c1ff496575eeb29181c0 [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
Steve Anton10542f22019-01-11 09:11:00 -080011#ifndef RTC_BASE_SOCKET_ADAPTERS_H_
12#define RTC_BASE_SOCKET_ADAPTERS_H_
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000013
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020014#include <string>
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000015
Ali Tofigh7fa90572022-03-17 15:47:49 +010016#include "absl/strings/string_view.h"
Niels Möller44153152018-12-17 14:04:05 +010017#include "api/array_view.h"
Steve Anton10542f22019-01-11 09:11:00 -080018#include "rtc_base/async_socket.h"
Steve Anton10542f22019-01-11 09:11:00 -080019#include "rtc_base/crypt_string.h"
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020020
21namespace rtc {
22
23struct HttpAuthContext;
24class ByteBufferReader;
25class ByteBufferWriter;
26
27///////////////////////////////////////////////////////////////////////////////
28
29// Implements a socket adapter that can buffer and process data internally,
30// as in the case of connecting to a proxy, where you must speak the proxy
31// protocol before commencing normal socket behavior.
32class BufferedReadAdapter : public AsyncSocketAdapter {
33 public:
Niels Möllerd0b88792021-08-12 10:32:30 +020034 BufferedReadAdapter(Socket* socket, size_t buffer_size);
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020035 ~BufferedReadAdapter() override;
36
Byoungchan Lee14af7622022-01-12 05:24:58 +090037 BufferedReadAdapter(const BufferedReadAdapter&) = delete;
38 BufferedReadAdapter& operator=(const BufferedReadAdapter&) = delete;
39
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020040 int Send(const void* pv, size_t cb) override;
41 int Recv(void* pv, size_t cb, int64_t* timestamp) override;
42
43 protected:
44 int DirectSend(const void* pv, size_t cb) {
45 return AsyncSocketAdapter::Send(pv, cb);
46 }
47
48 void BufferInput(bool on = true);
49 virtual void ProcessInput(char* data, size_t* len) = 0;
50
Niels Möllerd0b88792021-08-12 10:32:30 +020051 void OnReadEvent(Socket* socket) override;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020052
53 private:
Yves Gerey665174f2018-06-19 15:03:05 +020054 char* buffer_;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020055 size_t buffer_size_, data_len_;
56 bool buffering_;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020057};
58
59///////////////////////////////////////////////////////////////////////////////
60
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020061// Implements a socket adapter that performs the client side of a
62// fake SSL handshake. Used for "ssltcp" P2P functionality.
63class AsyncSSLSocket : public BufferedReadAdapter {
64 public:
Niels Möller44153152018-12-17 14:04:05 +010065 static ArrayView<const uint8_t> SslClientHello();
66 static ArrayView<const uint8_t> SslServerHello();
67
Niels Möllerd0b88792021-08-12 10:32:30 +020068 explicit AsyncSSLSocket(Socket* socket);
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020069
Byoungchan Lee14af7622022-01-12 05:24:58 +090070 AsyncSSLSocket(const AsyncSSLSocket&) = delete;
71 AsyncSSLSocket& operator=(const AsyncSSLSocket&) = delete;
72
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020073 int Connect(const SocketAddress& addr) override;
74
75 protected:
Niels Möllerd0b88792021-08-12 10:32:30 +020076 void OnConnectEvent(Socket* socket) override;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020077 void ProcessInput(char* data, size_t* len) override;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020078};
79
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020080///////////////////////////////////////////////////////////////////////////////
81
82// Implements a socket adapter that speaks the HTTP/S proxy protocol.
83class AsyncHttpsProxySocket : public BufferedReadAdapter {
84 public:
Niels Möllerd0b88792021-08-12 10:32:30 +020085 AsyncHttpsProxySocket(Socket* socket,
Ali Tofigh7fa90572022-03-17 15:47:49 +010086 absl::string_view user_agent,
Yves Gerey665174f2018-06-19 15:03:05 +020087 const SocketAddress& proxy,
Ali Tofigh7fa90572022-03-17 15:47:49 +010088 absl::string_view username,
Yves Gerey665174f2018-06-19 15:03:05 +020089 const CryptString& password);
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020090 ~AsyncHttpsProxySocket() override;
91
Byoungchan Lee14af7622022-01-12 05:24:58 +090092 AsyncHttpsProxySocket(const AsyncHttpsProxySocket&) = delete;
93 AsyncHttpsProxySocket& operator=(const AsyncHttpsProxySocket&) = delete;
94
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020095 // If connect is forced, the adapter will always issue an HTTP CONNECT to the
96 // target address. Otherwise, it will connect only if the destination port
97 // is not port 80.
98 void SetForceConnect(bool force) { force_connect_ = force; }
99
100 int Connect(const SocketAddress& addr) override;
101 SocketAddress GetRemoteAddress() const override;
102 int Close() override;
103 ConnState GetState() const override;
104
105 protected:
Niels Möllerd0b88792021-08-12 10:32:30 +0200106 void OnConnectEvent(Socket* socket) override;
107 void OnCloseEvent(Socket* socket, int err) override;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200108 void ProcessInput(char* data, size_t* len) override;
109
110 bool ShouldIssueConnect() const;
111 void SendRequest();
112 void ProcessLine(char* data, size_t len);
113 void EndResponse();
114 void Error(int error);
115
116 private:
117 SocketAddress proxy_, dest_;
118 std::string agent_, user_, headers_;
119 CryptString pass_;
120 bool force_connect_;
121 size_t content_length_;
122 int defer_error_;
123 bool expect_close_;
124 enum ProxyState {
Yves Gerey665174f2018-06-19 15:03:05 +0200125 PS_INIT,
126 PS_LEADER,
127 PS_AUTHENTICATE,
128 PS_SKIP_HEADERS,
129 PS_ERROR_HEADERS,
130 PS_TUNNEL_HEADERS,
131 PS_SKIP_BODY,
132 PS_TUNNEL,
133 PS_WAIT_CLOSE,
134 PS_ERROR
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200135 } state_;
Yves Gerey665174f2018-06-19 15:03:05 +0200136 HttpAuthContext* context_;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200137 std::string unknown_mechanisms_;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200138};
139
140///////////////////////////////////////////////////////////////////////////////
141
142// Implements a socket adapter that speaks the SOCKS proxy protocol.
143class AsyncSocksProxySocket : public BufferedReadAdapter {
144 public:
Niels Möllerd0b88792021-08-12 10:32:30 +0200145 AsyncSocksProxySocket(Socket* socket,
Yves Gerey665174f2018-06-19 15:03:05 +0200146 const SocketAddress& proxy,
Ali Tofigh7fa90572022-03-17 15:47:49 +0100147 absl::string_view username,
Yves Gerey665174f2018-06-19 15:03:05 +0200148 const CryptString& password);
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200149 ~AsyncSocksProxySocket() override;
150
Byoungchan Lee14af7622022-01-12 05:24:58 +0900151 AsyncSocksProxySocket(const AsyncSocksProxySocket&) = delete;
152 AsyncSocksProxySocket& operator=(const AsyncSocksProxySocket&) = delete;
153
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200154 int Connect(const SocketAddress& addr) override;
155 SocketAddress GetRemoteAddress() const override;
156 int Close() override;
157 ConnState GetState() const override;
158
159 protected:
Niels Möllerd0b88792021-08-12 10:32:30 +0200160 void OnConnectEvent(Socket* socket) override;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200161 void ProcessInput(char* data, size_t* len) override;
162
163 void SendHello();
164 void SendConnect();
165 void SendAuth();
166 void Error(int error);
167
168 private:
Yves Gerey665174f2018-06-19 15:03:05 +0200169 enum State { SS_INIT, SS_HELLO, SS_AUTH, SS_CONNECT, SS_TUNNEL, SS_ERROR };
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200170 State state_;
171 SocketAddress proxy_, dest_;
172 std::string user_;
173 CryptString pass_;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200174};
175
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200176} // namespace rtc
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000177
Steve Anton10542f22019-01-11 09:11:00 -0800178#endif // RTC_BASE_SOCKET_ADAPTERS_H_