blob: 02f6bca3c99eb4f5cca58cce2080e2b53f4aa577 [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"
kwiberg4485ffb2016-04-26 08:14:39 -070018#include "webrtc/base/constructormagic.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000019#include "webrtc/base/cryptstring.h"
20#include "webrtc/base/logging.h"
21
22namespace rtc {
23
24struct HttpAuthContext;
jbauchf1f87202016-03-30 06:43:37 -070025class ByteBufferReader;
26class ByteBufferWriter;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000027
28///////////////////////////////////////////////////////////////////////////////
29
30// Implements a socket adapter that can buffer and process data internally,
31// as in the case of connecting to a proxy, where you must speak the proxy
32// protocol before commencing normal socket behavior.
33class BufferedReadAdapter : public AsyncSocketAdapter {
34 public:
35 BufferedReadAdapter(AsyncSocket* socket, size_t buffer_size);
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000036 ~BufferedReadAdapter() override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000037
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000038 int Send(const void* pv, size_t cb) override;
Stefan Holmer9131efd2016-05-23 18:19:26 +020039 int Recv(void* pv, size_t cb, int64_t* timestamp) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000040
41 protected:
42 int DirectSend(const void* pv, size_t cb) {
43 return AsyncSocketAdapter::Send(pv, cb);
44 }
45
46 void BufferInput(bool on = true);
47 virtual void ProcessInput(char* data, size_t* len) = 0;
48
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000049 void OnReadEvent(AsyncSocket* socket) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000050
51 private:
52 char * buffer_;
53 size_t buffer_size_, data_len_;
54 bool buffering_;
henrikg3c089d72015-09-16 05:37:44 -070055 RTC_DISALLOW_COPY_AND_ASSIGN(BufferedReadAdapter);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000056};
57
58///////////////////////////////////////////////////////////////////////////////
59
60// Interface for implementing proxy server sockets.
61class AsyncProxyServerSocket : public BufferedReadAdapter {
62 public:
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000063 AsyncProxyServerSocket(AsyncSocket* socket, size_t buffer_size);
64 ~AsyncProxyServerSocket() override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000065 sigslot::signal2<AsyncProxyServerSocket*,
66 const SocketAddress&> SignalConnectRequest;
67 virtual void SendConnectResult(int err, const SocketAddress& addr) = 0;
68};
69
70///////////////////////////////////////////////////////////////////////////////
71
72// Implements a socket adapter that performs the client side of a
73// fake SSL handshake. Used for "ssltcp" P2P functionality.
74class AsyncSSLSocket : public BufferedReadAdapter {
75 public:
76 explicit AsyncSSLSocket(AsyncSocket* socket);
77
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000078 int Connect(const SocketAddress& addr) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000079
80 protected:
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000081 void OnConnectEvent(AsyncSocket* socket) override;
82 void ProcessInput(char* data, size_t* len) override;
henrikg3c089d72015-09-16 05:37:44 -070083 RTC_DISALLOW_COPY_AND_ASSIGN(AsyncSSLSocket);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000084};
85
86// Implements a socket adapter that performs the server side of a
87// fake SSL handshake. Used when implementing a relay server that does "ssltcp".
88class AsyncSSLServerSocket : public BufferedReadAdapter {
89 public:
90 explicit AsyncSSLServerSocket(AsyncSocket* socket);
91
92 protected:
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000093 void ProcessInput(char* data, size_t* len) override;
henrikg3c089d72015-09-16 05:37:44 -070094 RTC_DISALLOW_COPY_AND_ASSIGN(AsyncSSLServerSocket);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000095};
96
97///////////////////////////////////////////////////////////////////////////////
98
99// Implements a socket adapter that speaks the HTTP/S proxy protocol.
100class AsyncHttpsProxySocket : public BufferedReadAdapter {
101 public:
102 AsyncHttpsProxySocket(AsyncSocket* socket, const std::string& user_agent,
103 const SocketAddress& proxy,
104 const std::string& username, const CryptString& password);
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000105 ~AsyncHttpsProxySocket() override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000106
107 // If connect is forced, the adapter will always issue an HTTP CONNECT to the
108 // target address. Otherwise, it will connect only if the destination port
109 // is not port 80.
110 void SetForceConnect(bool force) { force_connect_ = force; }
111
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000112 int Connect(const SocketAddress& addr) override;
113 SocketAddress GetRemoteAddress() const override;
114 int Close() override;
115 ConnState GetState() const override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000116
117 protected:
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000118 void OnConnectEvent(AsyncSocket* socket) override;
119 void OnCloseEvent(AsyncSocket* socket, int err) override;
120 void ProcessInput(char* data, size_t* len) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000121
122 bool ShouldIssueConnect() const;
123 void SendRequest();
124 void ProcessLine(char* data, size_t len);
125 void EndResponse();
126 void Error(int error);
127
128 private:
129 SocketAddress proxy_, dest_;
130 std::string agent_, user_, headers_;
131 CryptString pass_;
132 bool force_connect_;
133 size_t content_length_;
134 int defer_error_;
135 bool expect_close_;
136 enum ProxyState {
137 PS_INIT, PS_LEADER, PS_AUTHENTICATE, PS_SKIP_HEADERS, PS_ERROR_HEADERS,
138 PS_TUNNEL_HEADERS, PS_SKIP_BODY, PS_TUNNEL, PS_WAIT_CLOSE, PS_ERROR
139 } state_;
140 HttpAuthContext * context_;
141 std::string unknown_mechanisms_;
henrikg3c089d72015-09-16 05:37:44 -0700142 RTC_DISALLOW_COPY_AND_ASSIGN(AsyncHttpsProxySocket);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000143};
144
145/* TODO: Implement this.
146class AsyncHttpsProxyServerSocket : public AsyncProxyServerSocket {
147 public:
148 explicit AsyncHttpsProxyServerSocket(AsyncSocket* socket);
149
150 private:
151 virtual void ProcessInput(char * data, size_t& len);
152 void Error(int error);
henrikg3c089d72015-09-16 05:37:44 -0700153 RTC_DISALLOW_COPY_AND_ASSIGN(AsyncHttpsProxyServerSocket);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000154};
155*/
156
157///////////////////////////////////////////////////////////////////////////////
158
159// Implements a socket adapter that speaks the SOCKS proxy protocol.
160class AsyncSocksProxySocket : public BufferedReadAdapter {
161 public:
162 AsyncSocksProxySocket(AsyncSocket* socket, const SocketAddress& proxy,
163 const std::string& username, const CryptString& password);
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000164 ~AsyncSocksProxySocket() override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000165
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000166 int Connect(const SocketAddress& addr) override;
167 SocketAddress GetRemoteAddress() const override;
168 int Close() override;
169 ConnState GetState() const override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000170
171 protected:
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000172 void OnConnectEvent(AsyncSocket* socket) override;
173 void ProcessInput(char* data, size_t* len) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000174
175 void SendHello();
176 void SendConnect();
177 void SendAuth();
178 void Error(int error);
179
180 private:
181 enum State {
182 SS_INIT, SS_HELLO, SS_AUTH, SS_CONNECT, SS_TUNNEL, SS_ERROR
183 };
184 State state_;
185 SocketAddress proxy_, dest_;
186 std::string user_;
187 CryptString pass_;
henrikg3c089d72015-09-16 05:37:44 -0700188 RTC_DISALLOW_COPY_AND_ASSIGN(AsyncSocksProxySocket);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000189};
190
191// Implements a proxy server socket for the SOCKS protocol.
192class AsyncSocksProxyServerSocket : public AsyncProxyServerSocket {
193 public:
194 explicit AsyncSocksProxyServerSocket(AsyncSocket* socket);
195
196 private:
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000197 void ProcessInput(char* data, size_t* len) override;
jbauchf1f87202016-03-30 06:43:37 -0700198 void DirectSend(const ByteBufferWriter& buf);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000199
jbauchf1f87202016-03-30 06:43:37 -0700200 void HandleHello(ByteBufferReader* request);
Peter Boström0c4e06b2015-10-07 12:23:21 +0200201 void SendHelloReply(uint8_t method);
jbauchf1f87202016-03-30 06:43:37 -0700202 void HandleAuth(ByteBufferReader* request);
Peter Boström0c4e06b2015-10-07 12:23:21 +0200203 void SendAuthReply(uint8_t result);
jbauchf1f87202016-03-30 06:43:37 -0700204 void HandleConnect(ByteBufferReader* request);
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000205 void SendConnectResult(int result, const SocketAddress& addr) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000206
207 void Error(int error);
208
209 static const int kBufferSize = 1024;
210 enum State {
211 SS_HELLO, SS_AUTH, SS_CONNECT, SS_CONNECT_PENDING, SS_TUNNEL, SS_ERROR
212 };
213 State state_;
henrikg3c089d72015-09-16 05:37:44 -0700214 RTC_DISALLOW_COPY_AND_ASSIGN(AsyncSocksProxyServerSocket);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000215};
216
217///////////////////////////////////////////////////////////////////////////////
218
219// Implements a socket adapter that logs everything that it sends and receives.
220class LoggingSocketAdapter : public AsyncSocketAdapter {
221 public:
222 LoggingSocketAdapter(AsyncSocket* socket, LoggingSeverity level,
223 const char * label, bool hex_mode = false);
224
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000225 int Send(const void* pv, size_t cb) override;
226 int SendTo(const void* pv, size_t cb, const SocketAddress& addr) override;
Stefan Holmer9131efd2016-05-23 18:19:26 +0200227 int Recv(void* pv, size_t cb, int64_t* timestamp) override;
228 int RecvFrom(void* pv,
229 size_t cb,
230 SocketAddress* paddr,
231 int64_t* timestamp) override;
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000232 int Close() override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000233
234 protected:
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000235 void OnConnectEvent(AsyncSocket* socket) override;
236 void OnCloseEvent(AsyncSocket* socket, int err) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000237
238 private:
239 LoggingSeverity level_;
240 std::string label_;
241 bool hex_mode_;
242 LogMultilineState lms_;
henrikg3c089d72015-09-16 05:37:44 -0700243 RTC_DISALLOW_COPY_AND_ASSIGN(LoggingSocketAdapter);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000244};
245
246///////////////////////////////////////////////////////////////////////////////
247
248} // namespace rtc
249
250#endif // WEBRTC_BASE_SOCKETADAPTERS_H_