[content shell] implement testRunner.overridePreference
[chromium-blink-merge.git] / net / socket / socks_client_socket_pool.h
blob96c484263ca2f517c8ef60cdd87a803a2bed7963
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_
8 #include <string>
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"
21 namespace net {
23 class ConnectJobFactory;
24 class TransportClientSocketPool;
25 class TransportSocketParams;
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);
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_; }
41 private:
42 friend class base::RefCounted<SOCKSSocketParams>;
43 ~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_;
49 const bool socks_v5_;
50 bool ignore_limits_;
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 {
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();
68 // ConnectJob methods.
69 virtual LoadState GetLoadState() const OVERRIDE;
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,
80 void OnIOComplete(int result);
82 // Runs the state transition loop.
83 int DoLoop(int result);
85 int DoTransportConnect();
86 int DoTransportConnectComplete(int result);
87 int DoSOCKSConnect();
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_;
99 State next_state_;
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 {
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);
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,
129 const void* params,
130 int num_sockets,
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,
138 int id) OVERRIDE;
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;
171 private:
172 typedef ClientSocketPoolBase<SOCKSSocketParams> PoolBase;
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) {}
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;
193 private:
194 TransportClientSocketPool* const transport_pool_;
195 HostResolver* const host_resolver_;
196 NetLog* net_log_;
198 DISALLOW_COPY_AND_ASSIGN(SOCKSConnectJobFactory);
201 TransportClientSocketPool* const transport_pool_;
202 PoolBase base_;
204 DISALLOW_COPY_AND_ASSIGN(SOCKSClientSocketPool);
207 REGISTER_SOCKET_PARAMS_FOR_POOL(SOCKSClientSocketPool, SOCKSSocketParams);
209 } // namespace net
211 #endif // NET_SOCKET_SOCKS_CLIENT_SOCKET_POOL_H_