1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef NET_SOCKET_SOCKS_CLIENT_SOCKET_POOL_H_ 6 #define NET_SOCKET_SOCKS_CLIENT_SOCKET_POOL_H_ 7 8 #include <string> 9 10 #include "base/basictypes.h" 11 #include "base/compiler_specific.h" 12 #include "base/memory/ref_counted.h" 13 #include "base/memory/scoped_ptr.h" 14 #include "base/time/time.h" 15 #include "net/base/host_port_pair.h" 16 #include "net/dns/host_resolver.h" 17 #include "net/socket/client_socket_pool.h" 18 #include "net/socket/client_socket_pool_base.h" 19 #include "net/socket/client_socket_pool_histograms.h" 20 21 namespace net { 22 23 class ConnectJobFactory; 24 class TransportClientSocketPool; 25 class TransportSocketParams; 26 27 class NET_EXPORT_PRIVATE SOCKSSocketParams 28 : public base::RefCounted<SOCKSSocketParams> { 29 public: 30 SOCKSSocketParams(const scoped_refptr<TransportSocketParams>& proxy_server, 31 bool socks_v5, const HostPortPair& host_port_pair, 32 RequestPriority priority); 33 34 const scoped_refptr<TransportSocketParams>& transport_params() const { 35 return transport_params_; 36 } 37 const HostResolver::RequestInfo& destination() const { return destination_; } 38 bool is_socks_v5() const { return socks_v5_; } 39 bool ignore_limits() const { return ignore_limits_; } 40 41 private: 42 friend class base::RefCounted<SOCKSSocketParams>; 43 ~SOCKSSocketParams(); 44 45 // The transport (likely TCP) connection must point toward the proxy server. 46 const scoped_refptr<TransportSocketParams> transport_params_; 47 // This is the HTTP destination. 48 HostResolver::RequestInfo destination_; 49 const bool socks_v5_; 50 bool ignore_limits_; 51 52 DISALLOW_COPY_AND_ASSIGN(SOCKSSocketParams); 53 }; 54 55 // SOCKSConnectJob handles the handshake to a socks server after setting up 56 // an underlying transport socket. 57 class SOCKSConnectJob : public ConnectJob { 58 public: 59 SOCKSConnectJob(const std::string& group_name, 60 const scoped_refptr<SOCKSSocketParams>& params, 61 const base::TimeDelta& timeout_duration, 62 TransportClientSocketPool* transport_pool, 63 HostResolver* host_resolver, 64 Delegate* delegate, 65 NetLog* net_log); 66 virtual ~SOCKSConnectJob(); 67 68 // ConnectJob methods. 69 virtual LoadState GetLoadState() const OVERRIDE; 70 71 private: 72 enum State { 73 STATE_TRANSPORT_CONNECT, 74 STATE_TRANSPORT_CONNECT_COMPLETE, 75 STATE_SOCKS_CONNECT, 76 STATE_SOCKS_CONNECT_COMPLETE, 77 STATE_NONE, 78 }; 79 80 void OnIOComplete(int result); 81 82 // Runs the state transition loop. 83 int DoLoop(int result); 84 85 int DoTransportConnect(); 86 int DoTransportConnectComplete(int result); 87 int DoSOCKSConnect(); 88 int DoSOCKSConnectComplete(int result); 89 90 // Begins the transport connection and the SOCKS handshake. Returns OK on 91 // success and ERR_IO_PENDING if it cannot immediately service the request. 92 // Otherwise, it returns a net error code. 93 virtual int ConnectInternal() OVERRIDE; 94 95 scoped_refptr<SOCKSSocketParams> socks_params_; 96 TransportClientSocketPool* const transport_pool_; 97 HostResolver* const resolver_; 98 99 State next_state_; 100 CompletionCallback callback_; 101 scoped_ptr<ClientSocketHandle> transport_socket_handle_; 102 scoped_ptr<StreamSocket> socket_; 103 104 DISALLOW_COPY_AND_ASSIGN(SOCKSConnectJob); 105 }; 106 107 class NET_EXPORT_PRIVATE SOCKSClientSocketPool 108 : public ClientSocketPool, public LayeredPool { 109 public: 110 SOCKSClientSocketPool( 111 int max_sockets, 112 int max_sockets_per_group, 113 ClientSocketPoolHistograms* histograms, 114 HostResolver* host_resolver, 115 TransportClientSocketPool* transport_pool, 116 NetLog* net_log); 117 118 virtual ~SOCKSClientSocketPool(); 119 120 // ClientSocketPool implementation. 121 virtual int RequestSocket(const std::string& group_name, 122 const void* connect_params, 123 RequestPriority priority, 124 ClientSocketHandle* handle, 125 const CompletionCallback& callback, 126 const BoundNetLog& net_log) OVERRIDE; 127 128 virtual void RequestSockets(const std::string& group_name, 129 const void* params, 130 int num_sockets, 131 const BoundNetLog& net_log) OVERRIDE; 132 133 virtual void CancelRequest(const std::string& group_name, 134 ClientSocketHandle* handle) OVERRIDE; 135 136 virtual void ReleaseSocket(const std::string& group_name, 137 StreamSocket* socket, 138 int id) OVERRIDE; 139 140 virtual void FlushWithError(int error) OVERRIDE; 141 142 virtual bool IsStalled() const OVERRIDE; 143 144 virtual void CloseIdleSockets() OVERRIDE; 145 146 virtual int IdleSocketCount() const OVERRIDE; 147 148 virtual int IdleSocketCountInGroup( 149 const std::string& group_name) const OVERRIDE; 150 151 virtual LoadState GetLoadState( 152 const std::string& group_name, 153 const ClientSocketHandle* handle) const OVERRIDE; 154 155 virtual void AddLayeredPool(LayeredPool* layered_pool) OVERRIDE; 156 157 virtual void RemoveLayeredPool(LayeredPool* layered_pool) OVERRIDE; 158 159 virtual base::DictionaryValue* GetInfoAsValue( 160 const std::string& name, 161 const std::string& type, 162 bool include_nested_pools) const OVERRIDE; 163 164 virtual base::TimeDelta ConnectionTimeout() const OVERRIDE; 165 166 virtual ClientSocketPoolHistograms* histograms() const OVERRIDE; 167 168 // LayeredPool implementation. 169 virtual bool CloseOneIdleConnection() OVERRIDE; 170 171 private: 172 typedef ClientSocketPoolBase<SOCKSSocketParams> PoolBase; 173 174 class SOCKSConnectJobFactory : public PoolBase::ConnectJobFactory { 175 public: 176 SOCKSConnectJobFactory(TransportClientSocketPool* transport_pool, 177 HostResolver* host_resolver, 178 NetLog* net_log) 179 : transport_pool_(transport_pool), 180 host_resolver_(host_resolver), 181 net_log_(net_log) {} 182 183 virtual ~SOCKSConnectJobFactory() {} 184 185 // ClientSocketPoolBase::ConnectJobFactory methods. 186 virtual ConnectJob* NewConnectJob( 187 const std::string& group_name, 188 const PoolBase::Request& request, 189 ConnectJob::Delegate* delegate) const OVERRIDE; 190 191 virtual base::TimeDelta ConnectionTimeout() const OVERRIDE; 192 193 private: 194 TransportClientSocketPool* const transport_pool_; 195 HostResolver* const host_resolver_; 196 NetLog* net_log_; 197 198 DISALLOW_COPY_AND_ASSIGN(SOCKSConnectJobFactory); 199 }; 200 201 TransportClientSocketPool* const transport_pool_; 202 PoolBase base_; 203 204 DISALLOW_COPY_AND_ASSIGN(SOCKSClientSocketPool); 205 }; 206 207 REGISTER_SOCKET_PARAMS_FOR_POOL(SOCKSClientSocketPool, SOCKSSocketParams); 208 209 } // namespace net 210 211 #endif // NET_SOCKET_SOCKS_CLIENT_SOCKET_POOL_H_ 212