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