blob: ae0ed9ac392ebe90715a5e75635a20cdba4d5fcc [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
11#ifndef WEBRTC_BASE_SOCKETADAPTERS_H_
12#define WEBRTC_BASE_SOCKETADAPTERS_H_
13
14#include <map>
15#include <string>
16
17#include "webrtc/base/asyncsocket.h"
18#include "webrtc/base/cryptstring.h"
19#include "webrtc/base/logging.h"
20
21namespace rtc {
22
23struct HttpAuthContext;
jbauchf1f87202016-03-30 06:43:37 -070024class ByteBufferReader;
25class ByteBufferWriter;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000026
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:
34 BufferedReadAdapter(AsyncSocket* socket, size_t buffer_size);
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000035 ~BufferedReadAdapter() override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000036
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000037 int Send(const void* pv, size_t cb) override;
38 int Recv(void* pv, size_t cb) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000039
40 protected:
41 int DirectSend(const void* pv, size_t cb) {
42 return AsyncSocketAdapter::Send(pv, cb);
43 }
44
45 void BufferInput(bool on = true);
46 virtual void ProcessInput(char* data, size_t* len) = 0;
47
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000048 void OnReadEvent(AsyncSocket* socket) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000049
50 private:
51 char * buffer_;
52 size_t buffer_size_, data_len_;
53 bool buffering_;
henrikg3c089d72015-09-16 05:37:44 -070054 RTC_DISALLOW_COPY_AND_ASSIGN(BufferedReadAdapter);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000055};
56
57///////////////////////////////////////////////////////////////////////////////
58
59// Interface for implementing proxy server sockets.
60class AsyncProxyServerSocket : public BufferedReadAdapter {
61 public:
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000062 AsyncProxyServerSocket(AsyncSocket* socket, size_t buffer_size);
63 ~AsyncProxyServerSocket() override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000064 sigslot::signal2<AsyncProxyServerSocket*,
65 const SocketAddress&> SignalConnectRequest;
66 virtual void SendConnectResult(int err, const SocketAddress& addr) = 0;
67};
68
69///////////////////////////////////////////////////////////////////////////////
70
71// Implements a socket adapter that performs the client side of a
72// fake SSL handshake. Used for "ssltcp" P2P functionality.
73class AsyncSSLSocket : public BufferedReadAdapter {
74 public:
75 explicit AsyncSSLSocket(AsyncSocket* socket);
76
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000077 int Connect(const SocketAddress& addr) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000078
79 protected:
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000080 void OnConnectEvent(AsyncSocket* socket) override;
81 void ProcessInput(char* data, size_t* len) override;
henrikg3c089d72015-09-16 05:37:44 -070082 RTC_DISALLOW_COPY_AND_ASSIGN(AsyncSSLSocket);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000083};
84
85// Implements a socket adapter that performs the server side of a
86// fake SSL handshake. Used when implementing a relay server that does "ssltcp".
87class AsyncSSLServerSocket : public BufferedReadAdapter {
88 public:
89 explicit AsyncSSLServerSocket(AsyncSocket* socket);
90
91 protected:
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000092 void ProcessInput(char* data, size_t* len) override;
henrikg3c089d72015-09-16 05:37:44 -070093 RTC_DISALLOW_COPY_AND_ASSIGN(AsyncSSLServerSocket);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000094};
95
96///////////////////////////////////////////////////////////////////////////////
97
98// Implements a socket adapter that speaks the HTTP/S proxy protocol.
99class AsyncHttpsProxySocket : public BufferedReadAdapter {
100 public:
101 AsyncHttpsProxySocket(AsyncSocket* socket, const std::string& user_agent,
102 const SocketAddress& proxy,
103 const std::string& username, const CryptString& password);
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000104 ~AsyncHttpsProxySocket() override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000105
106 // If connect is forced, the adapter will always issue an HTTP CONNECT to the
107 // target address. Otherwise, it will connect only if the destination port
108 // is not port 80.
109 void SetForceConnect(bool force) { force_connect_ = force; }
110
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000111 int Connect(const SocketAddress& addr) override;
112 SocketAddress GetRemoteAddress() const override;
113 int Close() override;
114 ConnState GetState() const override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000115
116 protected:
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000117 void OnConnectEvent(AsyncSocket* socket) override;
118 void OnCloseEvent(AsyncSocket* socket, int err) override;
119 void ProcessInput(char* data, size_t* len) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000120
121 bool ShouldIssueConnect() const;
122 void SendRequest();
123 void ProcessLine(char* data, size_t len);
124 void EndResponse();
125 void Error(int error);
126
127 private:
128 SocketAddress proxy_, dest_;
129 std::string agent_, user_, headers_;
130 CryptString pass_;
131 bool force_connect_;
132 size_t content_length_;
133 int defer_error_;
134 bool expect_close_;
135 enum ProxyState {
136 PS_INIT, PS_LEADER, PS_AUTHENTICATE, PS_SKIP_HEADERS, PS_ERROR_HEADERS,
137 PS_TUNNEL_HEADERS, PS_SKIP_BODY, PS_TUNNEL, PS_WAIT_CLOSE, PS_ERROR
138 } state_;
139 HttpAuthContext * context_;
140 std::string unknown_mechanisms_;
henrikg3c089d72015-09-16 05:37:44 -0700141 RTC_DISALLOW_COPY_AND_ASSIGN(AsyncHttpsProxySocket);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000142};
143
144/* TODO: Implement this.
145class AsyncHttpsProxyServerSocket : public AsyncProxyServerSocket {
146 public:
147 explicit AsyncHttpsProxyServerSocket(AsyncSocket* socket);
148
149 private:
150 virtual void ProcessInput(char * data, size_t& len);
151 void Error(int error);
henrikg3c089d72015-09-16 05:37:44 -0700152 RTC_DISALLOW_COPY_AND_ASSIGN(AsyncHttpsProxyServerSocket);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000153};
154*/
155
156///////////////////////////////////////////////////////////////////////////////
157
158// Implements a socket adapter that speaks the SOCKS proxy protocol.
159class AsyncSocksProxySocket : public BufferedReadAdapter {
160 public:
161 AsyncSocksProxySocket(AsyncSocket* socket, const SocketAddress& proxy,
162 const std::string& username, const CryptString& password);
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000163 ~AsyncSocksProxySocket() override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000164
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000165 int Connect(const SocketAddress& addr) override;
166 SocketAddress GetRemoteAddress() const override;
167 int Close() override;
168 ConnState GetState() const override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000169
170 protected:
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000171 void OnConnectEvent(AsyncSocket* socket) override;
172 void ProcessInput(char* data, size_t* len) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000173
174 void SendHello();
175 void SendConnect();
176 void SendAuth();
177 void Error(int error);
178
179 private:
180 enum State {
181 SS_INIT, SS_HELLO, SS_AUTH, SS_CONNECT, SS_TUNNEL, SS_ERROR
182 };
183 State state_;
184 SocketAddress proxy_, dest_;
185 std::string user_;
186 CryptString pass_;
henrikg3c089d72015-09-16 05:37:44 -0700187 RTC_DISALLOW_COPY_AND_ASSIGN(AsyncSocksProxySocket);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000188};
189
190// Implements a proxy server socket for the SOCKS protocol.
191class AsyncSocksProxyServerSocket : public AsyncProxyServerSocket {
192 public:
193 explicit AsyncSocksProxyServerSocket(AsyncSocket* socket);
194
195 private:
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000196 void ProcessInput(char* data, size_t* len) override;
jbauchf1f87202016-03-30 06:43:37 -0700197 void DirectSend(const ByteBufferWriter& buf);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000198
jbauchf1f87202016-03-30 06:43:37 -0700199 void HandleHello(ByteBufferReader* request);
Peter Boström0c4e06b2015-10-07 12:23:21 +0200200 void SendHelloReply(uint8_t method);
jbauchf1f87202016-03-30 06:43:37 -0700201 void HandleAuth(ByteBufferReader* request);
Peter Boström0c4e06b2015-10-07 12:23:21 +0200202 void SendAuthReply(uint8_t result);
jbauchf1f87202016-03-30 06:43:37 -0700203 void HandleConnect(ByteBufferReader* request);
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000204 void SendConnectResult(int result, const SocketAddress& addr) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000205
206 void Error(int error);
207
208 static const int kBufferSize = 1024;
209 enum State {
210 SS_HELLO, SS_AUTH, SS_CONNECT, SS_CONNECT_PENDING, SS_TUNNEL, SS_ERROR
211 };
212 State state_;
henrikg3c089d72015-09-16 05:37:44 -0700213 RTC_DISALLOW_COPY_AND_ASSIGN(AsyncSocksProxyServerSocket);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000214};
215
216///////////////////////////////////////////////////////////////////////////////
217
218// Implements a socket adapter that logs everything that it sends and receives.
219class LoggingSocketAdapter : public AsyncSocketAdapter {
220 public:
221 LoggingSocketAdapter(AsyncSocket* socket, LoggingSeverity level,
222 const char * label, bool hex_mode = false);
223
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000224 int Send(const void* pv, size_t cb) override;
225 int SendTo(const void* pv, size_t cb, const SocketAddress& addr) override;
226 int Recv(void* pv, size_t cb) override;
227 int RecvFrom(void* pv, size_t cb, SocketAddress* paddr) override;
228 int Close() override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000229
230 protected:
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000231 void OnConnectEvent(AsyncSocket* socket) override;
232 void OnCloseEvent(AsyncSocket* socket, int err) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000233
234 private:
235 LoggingSeverity level_;
236 std::string label_;
237 bool hex_mode_;
238 LogMultilineState lms_;
henrikg3c089d72015-09-16 05:37:44 -0700239 RTC_DISALLOW_COPY_AND_ASSIGN(LoggingSocketAdapter);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000240};
241
242///////////////////////////////////////////////////////////////////////////////
243
244} // namespace rtc
245
246#endif // WEBRTC_BASE_SOCKETADAPTERS_H_