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