15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_SOCKET_SOCKS_CLIENT_SOCKET_POOL_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_SOCKET_SOCKS_CLIENT_SOCKET_POOL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/host_port_pair.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/host_resolver.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/socket/client_socket_pool.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/client_socket_pool_base.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/client_socket_pool_histograms.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ConnectJobFactory;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TransportClientSocketPool;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TransportSocketParams;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE SOCKSSocketParams
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public base::RefCounted<SOCKSSocketParams> {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SOCKSSocketParams(const scoped_refptr<TransportSocketParams>& proxy_server,
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    bool socks_v5, const HostPortPair& host_port_pair);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const scoped_refptr<TransportSocketParams>& transport_params() const {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return transport_params_;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HostResolver::RequestInfo& destination() const { return destination_; }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_socks_v5() const { return socks_v5_; }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ignore_limits() const { return ignore_limits_; }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCounted<SOCKSSocketParams>;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~SOCKSSocketParams();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The transport (likely TCP) connection must point toward the proxy server.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const scoped_refptr<TransportSocketParams> transport_params_;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is the HTTP destination.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostResolver::RequestInfo destination_;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool socks_v5_;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ignore_limits_;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SOCKSSocketParams);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SOCKSConnectJob handles the handshake to a socks server after setting up
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an underlying transport socket.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SOCKSConnectJob : public ConnectJob {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SOCKSConnectJob(const std::string& group_name,
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                  RequestPriority priority,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const scoped_refptr<SOCKSSocketParams>& params,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const base::TimeDelta& timeout_duration,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  TransportClientSocketPool* transport_pool,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  HostResolver* host_resolver,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  Delegate* delegate,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  NetLog* net_log);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SOCKSConnectJob();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ConnectJob methods.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual LoadState GetLoadState() const OVERRIDE;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum State {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_TRANSPORT_CONNECT,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_TRANSPORT_CONNECT_COMPLETE,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_SOCKS_CONNECT,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_SOCKS_CONNECT_COMPLETE,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_NONE,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnIOComplete(int result);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs the state transition loop.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int DoLoop(int result);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int DoTransportConnect();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int DoTransportConnectComplete(int result);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int DoSOCKSConnect();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int DoSOCKSConnectComplete(int result);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Begins the transport connection and the SOCKS handshake.  Returns OK on
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // success and ERR_IO_PENDING if it cannot immediately service the request.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Otherwise, it returns a net error code.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int ConnectInternal() OVERRIDE;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SOCKSSocketParams> socks_params_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportClientSocketPool* const transport_pool_;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostResolver* const resolver_;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  State next_state_;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompletionCallback callback_;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ClientSocketHandle> transport_socket_handle_;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<StreamSocket> socket_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SOCKSConnectJob);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE SOCKSClientSocketPool
1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    : public ClientSocketPool, public HigherLayeredPool {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  typedef SOCKSSocketParams SocketParams;
1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SOCKSClientSocketPool(
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int max_sockets,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int max_sockets_per_group,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ClientSocketPoolHistograms* histograms,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HostResolver* host_resolver,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TransportClientSocketPool* transport_pool,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NetLog* net_log);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SOCKSClientSocketPool();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ClientSocketPool implementation.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int RequestSocket(const std::string& group_name,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const void* connect_params,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            RequestPriority priority,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            ClientSocketHandle* handle,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const CompletionCallback& callback,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const BoundNetLog& net_log) OVERRIDE;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RequestSockets(const std::string& group_name,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const void* params,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int num_sockets,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const BoundNetLog& net_log) OVERRIDE;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CancelRequest(const std::string& group_name,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ClientSocketHandle* handle) OVERRIDE;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ReleaseSocket(const std::string& group_name,
1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                             scoped_ptr<StreamSocket> socket,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             int id) OVERRIDE;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void FlushWithError(int error) OVERRIDE;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CloseIdleSockets() OVERRIDE;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int IdleSocketCount() const OVERRIDE;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int IdleSocketCountInGroup(
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& group_name) const OVERRIDE;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual LoadState GetLoadState(
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& group_name,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ClientSocketHandle* handle) const OVERRIDE;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual base::DictionaryValue* GetInfoAsValue(
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& name,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& type,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool include_nested_pools) const OVERRIDE;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual base::TimeDelta ConnectionTimeout() const OVERRIDE;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ClientSocketPoolHistograms* histograms() const OVERRIDE;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // LowerLayeredPool implementation.
1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual bool IsStalled() const OVERRIDE;
1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void AddHigherLayeredPool(HigherLayeredPool* higher_pool) OVERRIDE;
1683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) OVERRIDE;
1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // HigherLayeredPool implementation.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool CloseOneIdleConnection() OVERRIDE;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef ClientSocketPoolBase<SOCKSSocketParams> PoolBase;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class SOCKSConnectJobFactory : public PoolBase::ConnectJobFactory {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SOCKSConnectJobFactory(TransportClientSocketPool* transport_pool,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           HostResolver* host_resolver,
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           NetLog* net_log)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : transport_pool_(transport_pool),
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          host_resolver_(host_resolver),
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          net_log_(net_log) {}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~SOCKSConnectJobFactory() {}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ClientSocketPoolBase::ConnectJobFactory methods.
1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    virtual scoped_ptr<ConnectJob> NewConnectJob(
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const std::string& group_name,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const PoolBase::Request& request,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ConnectJob::Delegate* delegate) const OVERRIDE;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual base::TimeDelta ConnectionTimeout() const OVERRIDE;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TransportClientSocketPool* const transport_pool_;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HostResolver* const host_resolver_;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NetLog* net_log_;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(SOCKSConnectJobFactory);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportClientSocketPool* const transport_pool_;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PoolBase base_;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SOCKSClientSocketPool);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_SOCKET_SOCKS_CLIENT_SOCKET_POOL_H_
213