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.
5 #ifndef NET_SOCKET_SOCKS_CLIENT_SOCKET_POOL_H_
6 #define NET_SOCKET_SOCKS_CLIENT_SOCKET_POOL_H_
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.h"
15 #include "net/base/host_port_pair.h"
16 #include "net/base/host_resolver.h"
17 #include "net/socket/client_socket_pool_base.h"
18 #include "net/socket/client_socket_pool_histograms.h"
19 #include "net/socket/client_socket_pool.h"
23 class ConnectJobFactory
;
24 class TransportClientSocketPool
;
25 class TransportSocketParams
;
27 class NET_EXPORT_PRIVATE SOCKSSocketParams
28 : public base::RefCounted
<SOCKSSocketParams
> {
30 SOCKSSocketParams(const scoped_refptr
<TransportSocketParams
>& proxy_server
,
31 bool socks_v5
, const HostPortPair
& host_port_pair
,
32 RequestPriority priority
);
34 const scoped_refptr
<TransportSocketParams
>& transport_params() const {
35 return transport_params_
;
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_
; }
42 friend class base::RefCounted
<SOCKSSocketParams
>;
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_
;
52 DISALLOW_COPY_AND_ASSIGN(SOCKSSocketParams
);
55 // SOCKSConnectJob handles the handshake to a socks server after setting up
56 // an underlying transport socket.
57 class SOCKSConnectJob
: public ConnectJob
{
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
,
66 virtual ~SOCKSConnectJob();
68 // ConnectJob methods.
69 virtual LoadState
GetLoadState() const OVERRIDE
;
73 STATE_TRANSPORT_CONNECT
,
74 STATE_TRANSPORT_CONNECT_COMPLETE
,
76 STATE_SOCKS_CONNECT_COMPLETE
,
80 void OnIOComplete(int result
);
82 // Runs the state transition loop.
83 int DoLoop(int result
);
85 int DoTransportConnect();
86 int DoTransportConnectComplete(int result
);
88 int DoSOCKSConnectComplete(int result
);
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
;
95 scoped_refptr
<SOCKSSocketParams
> socks_params_
;
96 TransportClientSocketPool
* const transport_pool_
;
97 HostResolver
* const resolver_
;
100 CompletionCallback callback_
;
101 scoped_ptr
<ClientSocketHandle
> transport_socket_handle_
;
102 scoped_ptr
<StreamSocket
> socket_
;
104 DISALLOW_COPY_AND_ASSIGN(SOCKSConnectJob
);
107 class NET_EXPORT_PRIVATE SOCKSClientSocketPool
108 : public ClientSocketPool
, public LayeredPool
{
110 SOCKSClientSocketPool(
112 int max_sockets_per_group
,
113 ClientSocketPoolHistograms
* histograms
,
114 HostResolver
* host_resolver
,
115 TransportClientSocketPool
* transport_pool
,
118 virtual ~SOCKSClientSocketPool();
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
;
128 virtual void RequestSockets(const std::string
& group_name
,
131 const BoundNetLog
& net_log
) OVERRIDE
;
133 virtual void CancelRequest(const std::string
& group_name
,
134 ClientSocketHandle
* handle
) OVERRIDE
;
136 virtual void ReleaseSocket(const std::string
& group_name
,
137 StreamSocket
* socket
,
140 virtual void FlushWithError(int error
) OVERRIDE
;
142 virtual bool IsStalled() const OVERRIDE
;
144 virtual void CloseIdleSockets() OVERRIDE
;
146 virtual int IdleSocketCount() const OVERRIDE
;
148 virtual int IdleSocketCountInGroup(
149 const std::string
& group_name
) const OVERRIDE
;
151 virtual LoadState
GetLoadState(
152 const std::string
& group_name
,
153 const ClientSocketHandle
* handle
) const OVERRIDE
;
155 virtual void AddLayeredPool(LayeredPool
* layered_pool
) OVERRIDE
;
157 virtual void RemoveLayeredPool(LayeredPool
* layered_pool
) OVERRIDE
;
159 virtual base::DictionaryValue
* GetInfoAsValue(
160 const std::string
& name
,
161 const std::string
& type
,
162 bool include_nested_pools
) const OVERRIDE
;
164 virtual base::TimeDelta
ConnectionTimeout() const OVERRIDE
;
166 virtual ClientSocketPoolHistograms
* histograms() const OVERRIDE
;
168 // LayeredPool implementation.
169 virtual bool CloseOneIdleConnection() OVERRIDE
;
172 typedef ClientSocketPoolBase
<SOCKSSocketParams
> PoolBase
;
174 class SOCKSConnectJobFactory
: public PoolBase::ConnectJobFactory
{
176 SOCKSConnectJobFactory(TransportClientSocketPool
* transport_pool
,
177 HostResolver
* host_resolver
,
179 : transport_pool_(transport_pool
),
180 host_resolver_(host_resolver
),
183 virtual ~SOCKSConnectJobFactory() {}
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
;
191 virtual base::TimeDelta
ConnectionTimeout() const OVERRIDE
;
194 TransportClientSocketPool
* const transport_pool_
;
195 HostResolver
* const host_resolver_
;
198 DISALLOW_COPY_AND_ASSIGN(SOCKSConnectJobFactory
);
201 TransportClientSocketPool
* const transport_pool_
;
204 DISALLOW_COPY_AND_ASSIGN(SOCKSClientSocketPool
);
207 REGISTER_SOCKET_PARAMS_FOR_POOL(SOCKSClientSocketPool
, SOCKSSocketParams
);
211 #endif // NET_SOCKET_SOCKS_CLIENT_SOCKET_POOL_H_