147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * 447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Use of this source code is governed by a BSD-style license 547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * in the file PATENTS. All contributing project authors may 847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */ 1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef WEBRTC_BASE_SOCKETADAPTERS_H_ 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WEBRTC_BASE_SOCKETADAPTERS_H_ 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <map> 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <string> 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/asyncsocket.h" 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/cryptstring.h" 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/logging.h" 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstruct HttpAuthContext; 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass ByteBuffer; 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Implements a socket adapter that can buffer and process data internally, 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// as in the case of connecting to a proxy, where you must speak the proxy 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// protocol before commencing normal socket behavior. 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass BufferedReadAdapter : public AsyncSocketAdapter { 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org BufferedReadAdapter(AsyncSocket* socket, size_t buffer_size); 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual ~BufferedReadAdapter(); 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int Send(const void* pv, size_t cb); 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int Recv(void* pv, size_t cb); 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org protected: 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int DirectSend(const void* pv, size_t cb) { 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return AsyncSocketAdapter::Send(pv, cb); 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void BufferInput(bool on = true); 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void ProcessInput(char* data, size_t* len) = 0; 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void OnReadEvent(AsyncSocket * socket); 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org char * buffer_; 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org size_t buffer_size_, data_len_; 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool buffering_; 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DISALLOW_EVIL_CONSTRUCTORS(BufferedReadAdapter); 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Interface for implementing proxy server sockets. 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass AsyncProxyServerSocket : public BufferedReadAdapter { 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org AsyncProxyServerSocket(AsyncSocket* socket, size_t buffer_size) 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org : BufferedReadAdapter(socket, buffer_size) {} 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org sigslot::signal2<AsyncProxyServerSocket*, 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const SocketAddress&> SignalConnectRequest; 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void SendConnectResult(int err, const SocketAddress& addr) = 0; 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Implements a socket adapter that performs the client side of a 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// fake SSL handshake. Used for "ssltcp" P2P functionality. 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass AsyncSSLSocket : public BufferedReadAdapter { 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org explicit AsyncSSLSocket(AsyncSocket* socket); 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int Connect(const SocketAddress& addr); 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org protected: 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void OnConnectEvent(AsyncSocket* socket); 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void ProcessInput(char* data, size_t* len); 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DISALLOW_EVIL_CONSTRUCTORS(AsyncSSLSocket); 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Implements a socket adapter that performs the server side of a 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// fake SSL handshake. Used when implementing a relay server that does "ssltcp". 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass AsyncSSLServerSocket : public BufferedReadAdapter { 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org explicit AsyncSSLServerSocket(AsyncSocket* socket); 8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org protected: 9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void ProcessInput(char* data, size_t* len); 9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DISALLOW_EVIL_CONSTRUCTORS(AsyncSSLServerSocket); 9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Implements a socket adapter that speaks the HTTP/S proxy protocol. 9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass AsyncHttpsProxySocket : public BufferedReadAdapter { 9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org AsyncHttpsProxySocket(AsyncSocket* socket, const std::string& user_agent, 10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const SocketAddress& proxy, 10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const std::string& username, const CryptString& password); 10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual ~AsyncHttpsProxySocket(); 10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // If connect is forced, the adapter will always issue an HTTP CONNECT to the 10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // target address. Otherwise, it will connect only if the destination port 10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // is not port 80. 10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void SetForceConnect(bool force) { force_connect_ = force; } 10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int Connect(const SocketAddress& addr); 11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual SocketAddress GetRemoteAddress() const; 11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int Close(); 11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual ConnState GetState() const; 11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org protected: 11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void OnConnectEvent(AsyncSocket* socket); 11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void OnCloseEvent(AsyncSocket* socket, int err); 11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void ProcessInput(char* data, size_t* len); 11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool ShouldIssueConnect() const; 12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void SendRequest(); 12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void ProcessLine(char* data, size_t len); 12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void EndResponse(); 12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void Error(int error); 12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketAddress proxy_, dest_; 12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string agent_, user_, headers_; 12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org CryptString pass_; 13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool force_connect_; 13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org size_t content_length_; 13247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int defer_error_; 13347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool expect_close_; 13447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org enum ProxyState { 13547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org PS_INIT, PS_LEADER, PS_AUTHENTICATE, PS_SKIP_HEADERS, PS_ERROR_HEADERS, 13647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org PS_TUNNEL_HEADERS, PS_SKIP_BODY, PS_TUNNEL, PS_WAIT_CLOSE, PS_ERROR 13747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } state_; 13847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org HttpAuthContext * context_; 13947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string unknown_mechanisms_; 14047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DISALLOW_EVIL_CONSTRUCTORS(AsyncHttpsProxySocket); 14147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 14247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 14347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* TODO: Implement this. 14447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass AsyncHttpsProxyServerSocket : public AsyncProxyServerSocket { 14547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 14647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org explicit AsyncHttpsProxyServerSocket(AsyncSocket* socket); 14747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 14847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 14947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void ProcessInput(char * data, size_t& len); 15047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void Error(int error); 15147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DISALLOW_EVIL_CONSTRUCTORS(AsyncHttpsProxyServerSocket); 15247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 15347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org*/ 15447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 15547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 15647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 15747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Implements a socket adapter that speaks the SOCKS proxy protocol. 15847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass AsyncSocksProxySocket : public BufferedReadAdapter { 15947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 16047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org AsyncSocksProxySocket(AsyncSocket* socket, const SocketAddress& proxy, 16147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const std::string& username, const CryptString& password); 16247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 16347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int Connect(const SocketAddress& addr); 16447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual SocketAddress GetRemoteAddress() const; 16547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int Close(); 16647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual ConnState GetState() const; 16747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 16847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org protected: 16947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void OnConnectEvent(AsyncSocket* socket); 17047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void ProcessInput(char* data, size_t* len); 17147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 17247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void SendHello(); 17347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void SendConnect(); 17447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void SendAuth(); 17547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void Error(int error); 17647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 17747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 17847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org enum State { 17947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SS_INIT, SS_HELLO, SS_AUTH, SS_CONNECT, SS_TUNNEL, SS_ERROR 18047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org }; 18147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org State state_; 18247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketAddress proxy_, dest_; 18347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string user_; 18447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org CryptString pass_; 18547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DISALLOW_EVIL_CONSTRUCTORS(AsyncSocksProxySocket); 18647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 18747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 18847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Implements a proxy server socket for the SOCKS protocol. 18947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass AsyncSocksProxyServerSocket : public AsyncProxyServerSocket { 19047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 19147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org explicit AsyncSocksProxyServerSocket(AsyncSocket* socket); 19247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 19347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 19447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void ProcessInput(char* data, size_t* len); 19547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void DirectSend(const ByteBuffer& buf); 19647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 19747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void HandleHello(ByteBuffer* request); 198c2e6614c20710991cdbae41993e6c92d64dab9afhenrike@webrtc.org void SendHelloReply(uint8 method); 19947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void HandleAuth(ByteBuffer* request); 200c2e6614c20710991cdbae41993e6c92d64dab9afhenrike@webrtc.org void SendAuthReply(uint8 result); 20147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void HandleConnect(ByteBuffer* request); 20247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void SendConnectResult(int result, const SocketAddress& addr); 20347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 20447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void Error(int error); 20547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 20647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static const int kBufferSize = 1024; 20747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org enum State { 20847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SS_HELLO, SS_AUTH, SS_CONNECT, SS_CONNECT_PENDING, SS_TUNNEL, SS_ERROR 20947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org }; 21047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org State state_; 21147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DISALLOW_EVIL_CONSTRUCTORS(AsyncSocksProxyServerSocket); 21247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 21347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 21447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 21547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 21647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Implements a socket adapter that logs everything that it sends and receives. 21747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass LoggingSocketAdapter : public AsyncSocketAdapter { 21847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 21947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LoggingSocketAdapter(AsyncSocket* socket, LoggingSeverity level, 22047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const char * label, bool hex_mode = false); 22147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 22247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int Send(const void *pv, size_t cb); 22347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int SendTo(const void *pv, size_t cb, const SocketAddress& addr); 22447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int Recv(void *pv, size_t cb); 22547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int RecvFrom(void *pv, size_t cb, SocketAddress *paddr); 22647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int Close(); 22747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 22847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org protected: 22947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void OnConnectEvent(AsyncSocket * socket); 23047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void OnCloseEvent(AsyncSocket * socket, int err); 23147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 23247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 23347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LoggingSeverity level_; 23447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string label_; 23547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool hex_mode_; 23647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LogMultilineState lms_; 23747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DISALLOW_EVIL_CONSTRUCTORS(LoggingSocketAdapter); 23847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 23947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 24047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 24147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 24247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc 24347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 24447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WEBRTC_BASE_SOCKETADAPTERS_H_ 245