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