1 /* 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 21 namespace rtc { 22 23 struct HttpAuthContext; 24 class ByteBuffer; 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. 31 class BufferedReadAdapter : public AsyncSocketAdapter { 32 public: 33 BufferedReadAdapter(AsyncSocket* socket, size_t buffer_size); 34 virtual ~BufferedReadAdapter(); 35 36 virtual int Send(const void* pv, size_t cb); 37 virtual int Recv(void* pv, size_t cb); 38 39 protected: DirectSend(const void * pv,size_t cb)40 int DirectSend(const void* pv, size_t cb) { 41 return AsyncSocketAdapter::Send(pv, cb); 42 } 43 44 void BufferInput(bool on = true); 45 virtual void ProcessInput(char* data, size_t* len) = 0; 46 47 virtual void OnReadEvent(AsyncSocket * socket); 48 49 private: 50 char * buffer_; 51 size_t buffer_size_, data_len_; 52 bool buffering_; 53 DISALLOW_EVIL_CONSTRUCTORS(BufferedReadAdapter); 54 }; 55 56 /////////////////////////////////////////////////////////////////////////////// 57 58 // Interface for implementing proxy server sockets. 59 class AsyncProxyServerSocket : public BufferedReadAdapter { 60 public: AsyncProxyServerSocket(AsyncSocket * socket,size_t buffer_size)61 AsyncProxyServerSocket(AsyncSocket* socket, size_t buffer_size) 62 : BufferedReadAdapter(socket, buffer_size) {} 63 sigslot::signal2<AsyncProxyServerSocket*, 64 const SocketAddress&> SignalConnectRequest; 65 virtual void SendConnectResult(int err, const SocketAddress& addr) = 0; 66 }; 67 68 /////////////////////////////////////////////////////////////////////////////// 69 70 // Implements a socket adapter that performs the client side of a 71 // fake SSL handshake. Used for "ssltcp" P2P functionality. 72 class AsyncSSLSocket : public BufferedReadAdapter { 73 public: 74 explicit AsyncSSLSocket(AsyncSocket* socket); 75 76 virtual int Connect(const SocketAddress& addr); 77 78 protected: 79 virtual void OnConnectEvent(AsyncSocket* socket); 80 virtual void ProcessInput(char* data, size_t* len); 81 DISALLOW_EVIL_CONSTRUCTORS(AsyncSSLSocket); 82 }; 83 84 // Implements a socket adapter that performs the server side of a 85 // fake SSL handshake. Used when implementing a relay server that does "ssltcp". 86 class AsyncSSLServerSocket : public BufferedReadAdapter { 87 public: 88 explicit AsyncSSLServerSocket(AsyncSocket* socket); 89 90 protected: 91 virtual void ProcessInput(char* data, size_t* len); 92 DISALLOW_EVIL_CONSTRUCTORS(AsyncSSLServerSocket); 93 }; 94 95 /////////////////////////////////////////////////////////////////////////////// 96 97 // Implements a socket adapter that speaks the HTTP/S proxy protocol. 98 class AsyncHttpsProxySocket : public BufferedReadAdapter { 99 public: 100 AsyncHttpsProxySocket(AsyncSocket* socket, const std::string& user_agent, 101 const SocketAddress& proxy, 102 const std::string& username, const CryptString& password); 103 virtual ~AsyncHttpsProxySocket(); 104 105 // If connect is forced, the adapter will always issue an HTTP CONNECT to the 106 // target address. Otherwise, it will connect only if the destination port 107 // is not port 80. SetForceConnect(bool force)108 void SetForceConnect(bool force) { force_connect_ = force; } 109 110 virtual int Connect(const SocketAddress& addr); 111 virtual SocketAddress GetRemoteAddress() const; 112 virtual int Close(); 113 virtual ConnState GetState() const; 114 115 protected: 116 virtual void OnConnectEvent(AsyncSocket* socket); 117 virtual void OnCloseEvent(AsyncSocket* socket, int err); 118 virtual void ProcessInput(char* data, size_t* len); 119 120 bool ShouldIssueConnect() const; 121 void SendRequest(); 122 void ProcessLine(char* data, size_t len); 123 void EndResponse(); 124 void Error(int error); 125 126 private: 127 SocketAddress proxy_, dest_; 128 std::string agent_, user_, headers_; 129 CryptString pass_; 130 bool force_connect_; 131 size_t content_length_; 132 int defer_error_; 133 bool expect_close_; 134 enum ProxyState { 135 PS_INIT, PS_LEADER, PS_AUTHENTICATE, PS_SKIP_HEADERS, PS_ERROR_HEADERS, 136 PS_TUNNEL_HEADERS, PS_SKIP_BODY, PS_TUNNEL, PS_WAIT_CLOSE, PS_ERROR 137 } state_; 138 HttpAuthContext * context_; 139 std::string unknown_mechanisms_; 140 DISALLOW_EVIL_CONSTRUCTORS(AsyncHttpsProxySocket); 141 }; 142 143 /* TODO: Implement this. 144 class AsyncHttpsProxyServerSocket : public AsyncProxyServerSocket { 145 public: 146 explicit AsyncHttpsProxyServerSocket(AsyncSocket* socket); 147 148 private: 149 virtual void ProcessInput(char * data, size_t& len); 150 void Error(int error); 151 DISALLOW_EVIL_CONSTRUCTORS(AsyncHttpsProxyServerSocket); 152 }; 153 */ 154 155 /////////////////////////////////////////////////////////////////////////////// 156 157 // Implements a socket adapter that speaks the SOCKS proxy protocol. 158 class AsyncSocksProxySocket : public BufferedReadAdapter { 159 public: 160 AsyncSocksProxySocket(AsyncSocket* socket, const SocketAddress& proxy, 161 const std::string& username, const CryptString& password); 162 163 virtual int Connect(const SocketAddress& addr); 164 virtual SocketAddress GetRemoteAddress() const; 165 virtual int Close(); 166 virtual ConnState GetState() const; 167 168 protected: 169 virtual void OnConnectEvent(AsyncSocket* socket); 170 virtual void ProcessInput(char* data, size_t* len); 171 172 void SendHello(); 173 void SendConnect(); 174 void SendAuth(); 175 void Error(int error); 176 177 private: 178 enum State { 179 SS_INIT, SS_HELLO, SS_AUTH, SS_CONNECT, SS_TUNNEL, SS_ERROR 180 }; 181 State state_; 182 SocketAddress proxy_, dest_; 183 std::string user_; 184 CryptString pass_; 185 DISALLOW_EVIL_CONSTRUCTORS(AsyncSocksProxySocket); 186 }; 187 188 // Implements a proxy server socket for the SOCKS protocol. 189 class AsyncSocksProxyServerSocket : public AsyncProxyServerSocket { 190 public: 191 explicit AsyncSocksProxyServerSocket(AsyncSocket* socket); 192 193 private: 194 virtual void ProcessInput(char* data, size_t* len); 195 void DirectSend(const ByteBuffer& buf); 196 197 void HandleHello(ByteBuffer* request); 198 void SendHelloReply(int method); 199 void HandleAuth(ByteBuffer* request); 200 void SendAuthReply(int result); 201 void HandleConnect(ByteBuffer* request); 202 virtual void SendConnectResult(int result, const SocketAddress& addr); 203 204 void Error(int error); 205 206 static const int kBufferSize = 1024; 207 enum State { 208 SS_HELLO, SS_AUTH, SS_CONNECT, SS_CONNECT_PENDING, SS_TUNNEL, SS_ERROR 209 }; 210 State state_; 211 DISALLOW_EVIL_CONSTRUCTORS(AsyncSocksProxyServerSocket); 212 }; 213 214 /////////////////////////////////////////////////////////////////////////////// 215 216 // Implements a socket adapter that logs everything that it sends and receives. 217 class LoggingSocketAdapter : public AsyncSocketAdapter { 218 public: 219 LoggingSocketAdapter(AsyncSocket* socket, LoggingSeverity level, 220 const char * label, bool hex_mode = false); 221 222 virtual int Send(const void *pv, size_t cb); 223 virtual int SendTo(const void *pv, size_t cb, const SocketAddress& addr); 224 virtual int Recv(void *pv, size_t cb); 225 virtual int RecvFrom(void *pv, size_t cb, SocketAddress *paddr); 226 virtual int Close(); 227 228 protected: 229 virtual void OnConnectEvent(AsyncSocket * socket); 230 virtual void OnCloseEvent(AsyncSocket * socket, int err); 231 232 private: 233 LoggingSeverity level_; 234 std::string label_; 235 bool hex_mode_; 236 LogMultilineState lms_; 237 DISALLOW_EVIL_CONSTRUCTORS(LoggingSocketAdapter); 238 }; 239 240 /////////////////////////////////////////////////////////////////////////////// 241 242 } // namespace rtc 243 244 #endif // WEBRTC_BASE_SOCKETADAPTERS_H_ 245