blob: 55f62115d3f58ccb0edfe1238734ea9f764c9e65 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:261/*
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 17:11:0011#ifndef RTC_BASE_SOCKET_ADAPTERS_H_
12#define RTC_BASE_SOCKET_ADAPTERS_H_
henrike@webrtc.orgf0488722014-05-13 18:00:2613
Henrik Kjellanderec78f1c2017-06-29 05:52:5014#include <string>
henrike@webrtc.orgf0488722014-05-13 18:00:2615
Niels Möller44153152018-12-17 13:04:0516#include "api/array_view.h"
Steve Anton10542f22019-01-11 17:11:0017#include "rtc_base/async_socket.h"
Steve Anton10542f22019-01-11 17:11:0018#include "rtc_base/crypt_string.h"
Henrik Kjellanderec78f1c2017-06-29 05:52:5019
20namespace rtc {
21
22struct HttpAuthContext;
23class ByteBufferReader;
24class ByteBufferWriter;
25
26///////////////////////////////////////////////////////////////////////////////
27
28// Implements a socket adapter that can buffer and process data internally,
29// as in the case of connecting to a proxy, where you must speak the proxy
30// protocol before commencing normal socket behavior.
31class BufferedReadAdapter : public AsyncSocketAdapter {
32 public:
Niels Möllerd0b88792021-08-12 08:32:3033 BufferedReadAdapter(Socket* socket, size_t buffer_size);
Henrik Kjellanderec78f1c2017-06-29 05:52:5034 ~BufferedReadAdapter() override;
35
Byoungchan Lee14af7622022-01-11 20:24:5836 BufferedReadAdapter(const BufferedReadAdapter&) = delete;
37 BufferedReadAdapter& operator=(const BufferedReadAdapter&) = delete;
38
Henrik Kjellanderec78f1c2017-06-29 05:52:5039 int Send(const void* pv, size_t cb) override;
40 int Recv(void* pv, size_t cb, int64_t* timestamp) override;
41
42 protected:
43 int DirectSend(const void* pv, size_t cb) {
44 return AsyncSocketAdapter::Send(pv, cb);
45 }
46
47 void BufferInput(bool on = true);
48 virtual void ProcessInput(char* data, size_t* len) = 0;
49
Niels Möllerd0b88792021-08-12 08:32:3050 void OnReadEvent(Socket* socket) override;
Henrik Kjellanderec78f1c2017-06-29 05:52:5051
52 private:
Yves Gerey665174f2018-06-19 13:03:0553 char* buffer_;
Henrik Kjellanderec78f1c2017-06-29 05:52:5054 size_t buffer_size_, data_len_;
55 bool buffering_;
Henrik Kjellanderec78f1c2017-06-29 05:52:5056};
57
58///////////////////////////////////////////////////////////////////////////////
59
Henrik Kjellanderec78f1c2017-06-29 05:52:5060// Implements a socket adapter that performs the client side of a
61// fake SSL handshake. Used for "ssltcp" P2P functionality.
62class AsyncSSLSocket : public BufferedReadAdapter {
63 public:
Niels Möller44153152018-12-17 13:04:0564 static ArrayView<const uint8_t> SslClientHello();
65 static ArrayView<const uint8_t> SslServerHello();
66
Niels Möllerd0b88792021-08-12 08:32:3067 explicit AsyncSSLSocket(Socket* socket);
Henrik Kjellanderec78f1c2017-06-29 05:52:5068
Byoungchan Lee14af7622022-01-11 20:24:5869 AsyncSSLSocket(const AsyncSSLSocket&) = delete;
70 AsyncSSLSocket& operator=(const AsyncSSLSocket&) = delete;
71
Henrik Kjellanderec78f1c2017-06-29 05:52:5072 int Connect(const SocketAddress& addr) override;
73
74 protected:
Niels Möllerd0b88792021-08-12 08:32:3075 void OnConnectEvent(Socket* socket) override;
Henrik Kjellanderec78f1c2017-06-29 05:52:5076 void ProcessInput(char* data, size_t* len) override;
Henrik Kjellanderec78f1c2017-06-29 05:52:5077};
78
Henrik Kjellanderec78f1c2017-06-29 05:52:5079///////////////////////////////////////////////////////////////////////////////
80
81// Implements a socket adapter that speaks the HTTP/S proxy protocol.
82class AsyncHttpsProxySocket : public BufferedReadAdapter {
83 public:
Niels Möllerd0b88792021-08-12 08:32:3084 AsyncHttpsProxySocket(Socket* socket,
Yves Gerey665174f2018-06-19 13:03:0585 const std::string& user_agent,
86 const SocketAddress& proxy,
87 const std::string& username,
88 const CryptString& password);
Henrik Kjellanderec78f1c2017-06-29 05:52:5089 ~AsyncHttpsProxySocket() override;
90
Byoungchan Lee14af7622022-01-11 20:24:5891 AsyncHttpsProxySocket(const AsyncHttpsProxySocket&) = delete;
92 AsyncHttpsProxySocket& operator=(const AsyncHttpsProxySocket&) = delete;
93
Henrik Kjellanderec78f1c2017-06-29 05:52:5094 // If connect is forced, the adapter will always issue an HTTP CONNECT to the
95 // target address. Otherwise, it will connect only if the destination port
96 // is not port 80.
97 void SetForceConnect(bool force) { force_connect_ = force; }
98
99 int Connect(const SocketAddress& addr) override;
100 SocketAddress GetRemoteAddress() const override;
101 int Close() override;
102 ConnState GetState() const override;
103
104 protected:
Niels Möllerd0b88792021-08-12 08:32:30105 void OnConnectEvent(Socket* socket) override;
106 void OnCloseEvent(Socket* socket, int err) override;
Henrik Kjellanderec78f1c2017-06-29 05:52:50107 void ProcessInput(char* data, size_t* len) override;
108
109 bool ShouldIssueConnect() const;
110 void SendRequest();
111 void ProcessLine(char* data, size_t len);
112 void EndResponse();
113 void Error(int error);
114
115 private:
116 SocketAddress proxy_, dest_;
117 std::string agent_, user_, headers_;
118 CryptString pass_;
119 bool force_connect_;
120 size_t content_length_;
121 int defer_error_;
122 bool expect_close_;
123 enum ProxyState {
Yves Gerey665174f2018-06-19 13:03:05124 PS_INIT,
125 PS_LEADER,
126 PS_AUTHENTICATE,
127 PS_SKIP_HEADERS,
128 PS_ERROR_HEADERS,
129 PS_TUNNEL_HEADERS,
130 PS_SKIP_BODY,
131 PS_TUNNEL,
132 PS_WAIT_CLOSE,
133 PS_ERROR
Henrik Kjellanderec78f1c2017-06-29 05:52:50134 } state_;
Yves Gerey665174f2018-06-19 13:03:05135 HttpAuthContext* context_;
Henrik Kjellanderec78f1c2017-06-29 05:52:50136 std::string unknown_mechanisms_;
Henrik Kjellanderec78f1c2017-06-29 05:52:50137};
138
139///////////////////////////////////////////////////////////////////////////////
140
141// Implements a socket adapter that speaks the SOCKS proxy protocol.
142class AsyncSocksProxySocket : public BufferedReadAdapter {
143 public:
Niels Möllerd0b88792021-08-12 08:32:30144 AsyncSocksProxySocket(Socket* socket,
Yves Gerey665174f2018-06-19 13:03:05145 const SocketAddress& proxy,
146 const std::string& username,
147 const CryptString& password);
Henrik Kjellanderec78f1c2017-06-29 05:52:50148 ~AsyncSocksProxySocket() override;
149
Byoungchan Lee14af7622022-01-11 20:24:58150 AsyncSocksProxySocket(const AsyncSocksProxySocket&) = delete;
151 AsyncSocksProxySocket& operator=(const AsyncSocksProxySocket&) = delete;
152
Henrik Kjellanderec78f1c2017-06-29 05:52:50153 int Connect(const SocketAddress& addr) override;
154 SocketAddress GetRemoteAddress() const override;
155 int Close() override;
156 ConnState GetState() const override;
157
158 protected:
Niels Möllerd0b88792021-08-12 08:32:30159 void OnConnectEvent(Socket* socket) override;
Henrik Kjellanderec78f1c2017-06-29 05:52:50160 void ProcessInput(char* data, size_t* len) override;
161
162 void SendHello();
163 void SendConnect();
164 void SendAuth();
165 void Error(int error);
166
167 private:
Yves Gerey665174f2018-06-19 13:03:05168 enum State { SS_INIT, SS_HELLO, SS_AUTH, SS_CONNECT, SS_TUNNEL, SS_ERROR };
Henrik Kjellanderec78f1c2017-06-29 05:52:50169 State state_;
170 SocketAddress proxy_, dest_;
171 std::string user_;
172 CryptString pass_;
Henrik Kjellanderec78f1c2017-06-29 05:52:50173};
174
Henrik Kjellanderec78f1c2017-06-29 05:52:50175} // namespace rtc
henrike@webrtc.orgf0488722014-05-13 18:00:26176
Steve Anton10542f22019-01-11 17:11:00177#endif // RTC_BASE_SOCKET_ADAPTERS_H_