1f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/* 2f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * 4f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * Use of this source code is governed by a BSD-style license 5f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 6f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 7f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * in the file PATENTS. All contributing project authors may 8f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org */ 10f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 11f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#ifndef WEBRTC_BASE_SOCKETADAPTERS_H_ 12f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define WEBRTC_BASE_SOCKETADAPTERS_H_ 13f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 14f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <map> 15f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <string> 16f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 17f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/asyncsocket.h" 18f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/cryptstring.h" 19f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/logging.h" 20f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 21f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgnamespace rtc { 22f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 23f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstruct HttpAuthContext; 24f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass ByteBuffer; 25f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 26f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 27f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 28f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Implements a socket adapter that can buffer and process data internally, 29f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// as in the case of connecting to a proxy, where you must speak the proxy 30f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// protocol before commencing normal socket behavior. 31f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass BufferedReadAdapter : public AsyncSocketAdapter { 32f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 33f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org BufferedReadAdapter(AsyncSocket* socket, size_t buffer_size); 3467186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org ~BufferedReadAdapter() override; 35f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 3667186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org int Send(const void* pv, size_t cb) override; 3767186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org int Recv(void* pv, size_t cb) override; 38f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 39f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org protected: 40f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int DirectSend(const void* pv, size_t cb) { 41f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return AsyncSocketAdapter::Send(pv, cb); 42f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 43f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 44f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void BufferInput(bool on = true); 45f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual void ProcessInput(char* data, size_t* len) = 0; 46f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 4767186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org void OnReadEvent(AsyncSocket* socket) override; 48f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 49f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private: 50f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org char * buffer_; 51f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org size_t buffer_size_, data_len_; 52f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool buffering_; 533c089d751ede283e21e186885eaf705c3257ccd2henrikg RTC_DISALLOW_COPY_AND_ASSIGN(BufferedReadAdapter); 54f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 55f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 56f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 57f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 58f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Interface for implementing proxy server sockets. 59f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass AsyncProxyServerSocket : public BufferedReadAdapter { 60f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 6167186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org AsyncProxyServerSocket(AsyncSocket* socket, size_t buffer_size); 6267186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org ~AsyncProxyServerSocket() override; 63f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sigslot::signal2<AsyncProxyServerSocket*, 64f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress&> SignalConnectRequest; 65f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual void SendConnectResult(int err, const SocketAddress& addr) = 0; 66f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 67f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 68f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 69f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 70f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Implements a socket adapter that performs the client side of a 71f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// fake SSL handshake. Used for "ssltcp" P2P functionality. 72f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass AsyncSSLSocket : public BufferedReadAdapter { 73f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 74f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org explicit AsyncSSLSocket(AsyncSocket* socket); 75f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 7667186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org int Connect(const SocketAddress& addr) override; 77f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 78f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org protected: 7967186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org void OnConnectEvent(AsyncSocket* socket) override; 8067186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org void ProcessInput(char* data, size_t* len) override; 813c089d751ede283e21e186885eaf705c3257ccd2henrikg RTC_DISALLOW_COPY_AND_ASSIGN(AsyncSSLSocket); 82f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 83f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 84f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Implements a socket adapter that performs the server side of a 85f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// fake SSL handshake. Used when implementing a relay server that does "ssltcp". 86f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass AsyncSSLServerSocket : public BufferedReadAdapter { 87f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 88f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org explicit AsyncSSLServerSocket(AsyncSocket* socket); 89f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 90f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org protected: 9167186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org void ProcessInput(char* data, size_t* len) override; 923c089d751ede283e21e186885eaf705c3257ccd2henrikg RTC_DISALLOW_COPY_AND_ASSIGN(AsyncSSLServerSocket); 93f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 94f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 95f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 96f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 97f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Implements a socket adapter that speaks the HTTP/S proxy protocol. 98f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass AsyncHttpsProxySocket : public BufferedReadAdapter { 99f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 100f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncHttpsProxySocket(AsyncSocket* socket, const std::string& user_agent, 101f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress& proxy, 102f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const std::string& username, const CryptString& password); 10367186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org ~AsyncHttpsProxySocket() override; 104f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 105f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // If connect is forced, the adapter will always issue an HTTP CONNECT to the 106f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // target address. Otherwise, it will connect only if the destination port 107f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // is not port 80. 108f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void SetForceConnect(bool force) { force_connect_ = force; } 109f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 11067186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org int Connect(const SocketAddress& addr) override; 11167186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org SocketAddress GetRemoteAddress() const override; 11267186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org int Close() override; 11367186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org ConnState GetState() const override; 114f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 115f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org protected: 11667186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org void OnConnectEvent(AsyncSocket* socket) override; 11767186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org void OnCloseEvent(AsyncSocket* socket, int err) override; 11867186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org void ProcessInput(char* data, size_t* len) override; 119f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 120f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool ShouldIssueConnect() const; 121f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void SendRequest(); 122f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void ProcessLine(char* data, size_t len); 123f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void EndResponse(); 124f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void Error(int error); 125f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 126f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private: 127f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress proxy_, dest_; 128f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org std::string agent_, user_, headers_; 129f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CryptString pass_; 130f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool force_connect_; 131f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org size_t content_length_; 132f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int defer_error_; 133f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool expect_close_; 134f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org enum ProxyState { 135f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org PS_INIT, PS_LEADER, PS_AUTHENTICATE, PS_SKIP_HEADERS, PS_ERROR_HEADERS, 136f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org PS_TUNNEL_HEADERS, PS_SKIP_BODY, PS_TUNNEL, PS_WAIT_CLOSE, PS_ERROR 137f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } state_; 138f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org HttpAuthContext * context_; 139f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org std::string unknown_mechanisms_; 1403c089d751ede283e21e186885eaf705c3257ccd2henrikg RTC_DISALLOW_COPY_AND_ASSIGN(AsyncHttpsProxySocket); 141f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 142f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 143f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/* TODO: Implement this. 144f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass AsyncHttpsProxyServerSocket : public AsyncProxyServerSocket { 145f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 146f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org explicit AsyncHttpsProxyServerSocket(AsyncSocket* socket); 147f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 148f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private: 149f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual void ProcessInput(char * data, size_t& len); 150f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void Error(int error); 1513c089d751ede283e21e186885eaf705c3257ccd2henrikg RTC_DISALLOW_COPY_AND_ASSIGN(AsyncHttpsProxyServerSocket); 152f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 153f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org*/ 154f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 155f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 156f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 157f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Implements a socket adapter that speaks the SOCKS proxy protocol. 158f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass AsyncSocksProxySocket : public BufferedReadAdapter { 159f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 160f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocksProxySocket(AsyncSocket* socket, const SocketAddress& proxy, 161f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const std::string& username, const CryptString& password); 16267186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org ~AsyncSocksProxySocket() override; 163f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 16467186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org int Connect(const SocketAddress& addr) override; 16567186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org SocketAddress GetRemoteAddress() const override; 16667186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org int Close() override; 16767186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org ConnState GetState() const override; 168f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 169f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org protected: 17067186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org void OnConnectEvent(AsyncSocket* socket) override; 17167186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org void ProcessInput(char* data, size_t* len) override; 172f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 173f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void SendHello(); 174f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void SendConnect(); 175f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void SendAuth(); 176f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void Error(int error); 177f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 178f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private: 179f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org enum State { 180f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SS_INIT, SS_HELLO, SS_AUTH, SS_CONNECT, SS_TUNNEL, SS_ERROR 181f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org }; 182f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org State state_; 183f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress proxy_, dest_; 184f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org std::string user_; 185f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CryptString pass_; 1863c089d751ede283e21e186885eaf705c3257ccd2henrikg RTC_DISALLOW_COPY_AND_ASSIGN(AsyncSocksProxySocket); 187f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 188f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 189f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Implements a proxy server socket for the SOCKS protocol. 190f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass AsyncSocksProxyServerSocket : public AsyncProxyServerSocket { 191f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 192f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org explicit AsyncSocksProxyServerSocket(AsyncSocket* socket); 193f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 194f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private: 19567186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org void ProcessInput(char* data, size_t* len) override; 196f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void DirectSend(const ByteBuffer& buf); 197f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 198f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void HandleHello(ByteBuffer* request); 1990c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström void SendHelloReply(uint8_t method); 200f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void HandleAuth(ByteBuffer* request); 2010c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström void SendAuthReply(uint8_t result); 202f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void HandleConnect(ByteBuffer* request); 20367186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org void SendConnectResult(int result, const SocketAddress& addr) override; 204f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 205f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void Error(int error); 206f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 207f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static const int kBufferSize = 1024; 208f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org enum State { 209f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SS_HELLO, SS_AUTH, SS_CONNECT, SS_CONNECT_PENDING, SS_TUNNEL, SS_ERROR 210f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org }; 211f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org State state_; 2123c089d751ede283e21e186885eaf705c3257ccd2henrikg RTC_DISALLOW_COPY_AND_ASSIGN(AsyncSocksProxyServerSocket); 213f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 214f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 215f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 216f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 217f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Implements a socket adapter that logs everything that it sends and receives. 218f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass LoggingSocketAdapter : public AsyncSocketAdapter { 219f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 220f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LoggingSocketAdapter(AsyncSocket* socket, LoggingSeverity level, 221f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const char * label, bool hex_mode = false); 222f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 22367186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org int Send(const void* pv, size_t cb) override; 22467186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org int SendTo(const void* pv, size_t cb, const SocketAddress& addr) override; 22567186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org int Recv(void* pv, size_t cb) override; 22667186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org int RecvFrom(void* pv, size_t cb, SocketAddress* paddr) override; 22767186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org int Close() override; 228f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 229f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org protected: 23067186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org void OnConnectEvent(AsyncSocket* socket) override; 23167186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org void OnCloseEvent(AsyncSocket* socket, int err) override; 232f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 233f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private: 234f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LoggingSeverity level_; 235f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org std::string label_; 236f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool hex_mode_; 237f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LogMultilineState lms_; 2383c089d751ede283e21e186885eaf705c3257ccd2henrikg RTC_DISALLOW_COPY_AND_ASSIGN(LoggingSocketAdapter); 239f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 240f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 241f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 242f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 243f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} // namespace rtc 244f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 245f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif // WEBRTC_BASE_SOCKETADAPTERS_H_ 246