QUIC - enable persisting of QUICServerInfo (server config) to disk
[chromium-blink-merge.git] / net / socket / ssl_client_socket_pool.h
blob8c82681b93d6232ec9013d08a4500351273cdce5
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_SSL_CLIENT_SOCKET_POOL_H_
6 #define NET_SOCKET_SSL_CLIENT_SOCKET_POOL_H_
8 #include <string>
10 #include "base/memory/ref_counted.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/time/time.h"
13 #include "net/base/privacy_mode.h"
14 #include "net/dns/host_resolver.h"
15 #include "net/http/http_response_info.h"
16 #include "net/socket/client_socket_pool.h"
17 #include "net/socket/client_socket_pool_base.h"
18 #include "net/socket/client_socket_pool_histograms.h"
19 #include "net/socket/ssl_client_socket.h"
20 #include "net/ssl/ssl_config_service.h"
22 namespace net {
24 class CertVerifier;
25 class ClientSocketFactory;
26 class ConnectJobFactory;
27 class CTVerifier;
28 class HostPortPair;
29 class HttpProxyClientSocketPool;
30 class HttpProxySocketParams;
31 class SOCKSClientSocketPool;
32 class SOCKSSocketParams;
33 class SSLClientSocket;
34 class TransportClientSocketPool;
35 class TransportSecurityState;
36 class TransportSocketParams;
38 class NET_EXPORT_PRIVATE SSLSocketParams
39 : public base::RefCounted<SSLSocketParams> {
40 public:
41 enum ConnectionType { DIRECT, SOCKS_PROXY, HTTP_PROXY };
43 // Exactly one of |direct_params|, |socks_proxy_params|, and
44 // |http_proxy_params| must be non-NULL.
45 SSLSocketParams(
46 const scoped_refptr<TransportSocketParams>& direct_params,
47 const scoped_refptr<SOCKSSocketParams>& socks_proxy_params,
48 const scoped_refptr<HttpProxySocketParams>& http_proxy_params,
49 const HostPortPair& host_and_port,
50 const SSLConfig& ssl_config,
51 PrivacyMode privacy_mode,
52 int load_flags,
53 bool force_spdy_over_ssl,
54 bool want_spdy_over_npn);
56 // Returns the type of the underlying connection.
57 ConnectionType GetConnectionType() const;
59 // Must be called only when GetConnectionType() returns DIRECT.
60 const scoped_refptr<TransportSocketParams>&
61 GetDirectConnectionParams() const;
63 // Must be called only when GetConnectionType() returns SOCKS_PROXY.
64 const scoped_refptr<SOCKSSocketParams>&
65 GetSocksProxyConnectionParams() const;
67 // Must be called only when GetConnectionType() returns HTTP_PROXY.
68 const scoped_refptr<HttpProxySocketParams>&
69 GetHttpProxyConnectionParams() const;
71 const HostPortPair& host_and_port() const { return host_and_port_; }
72 const SSLConfig& ssl_config() const { return ssl_config_; }
73 PrivacyMode privacy_mode() const { return privacy_mode_; }
74 int load_flags() const { return load_flags_; }
75 bool force_spdy_over_ssl() const { return force_spdy_over_ssl_; }
76 bool want_spdy_over_npn() const { return want_spdy_over_npn_; }
77 bool ignore_limits() const { return ignore_limits_; }
79 private:
80 friend class base::RefCounted<SSLSocketParams>;
81 ~SSLSocketParams();
83 const scoped_refptr<TransportSocketParams> direct_params_;
84 const scoped_refptr<SOCKSSocketParams> socks_proxy_params_;
85 const scoped_refptr<HttpProxySocketParams> http_proxy_params_;
86 const HostPortPair host_and_port_;
87 const SSLConfig ssl_config_;
88 const PrivacyMode privacy_mode_;
89 const int load_flags_;
90 const bool force_spdy_over_ssl_;
91 const bool want_spdy_over_npn_;
92 bool ignore_limits_;
94 DISALLOW_COPY_AND_ASSIGN(SSLSocketParams);
97 // SSLConnectJob handles the SSL handshake after setting up the underlying
98 // connection as specified in the params.
99 class SSLConnectJob : public ConnectJob {
100 public:
101 SSLConnectJob(
102 const std::string& group_name,
103 RequestPriority priority,
104 const scoped_refptr<SSLSocketParams>& params,
105 const base::TimeDelta& timeout_duration,
106 TransportClientSocketPool* transport_pool,
107 SOCKSClientSocketPool* socks_pool,
108 HttpProxyClientSocketPool* http_proxy_pool,
109 ClientSocketFactory* client_socket_factory,
110 HostResolver* host_resolver,
111 const SSLClientSocketContext& context,
112 Delegate* delegate,
113 NetLog* net_log);
114 virtual ~SSLConnectJob();
116 // ConnectJob methods.
117 virtual LoadState GetLoadState() const OVERRIDE;
119 virtual void GetAdditionalErrorState(ClientSocketHandle * handle) OVERRIDE;
121 private:
122 enum State {
123 STATE_TRANSPORT_CONNECT,
124 STATE_TRANSPORT_CONNECT_COMPLETE,
125 STATE_SOCKS_CONNECT,
126 STATE_SOCKS_CONNECT_COMPLETE,
127 STATE_TUNNEL_CONNECT,
128 STATE_TUNNEL_CONNECT_COMPLETE,
129 STATE_SSL_CONNECT,
130 STATE_SSL_CONNECT_COMPLETE,
131 STATE_NONE,
134 void OnIOComplete(int result);
136 // Runs the state transition loop.
137 int DoLoop(int result);
139 int DoTransportConnect();
140 int DoTransportConnectComplete(int result);
141 int DoSOCKSConnect();
142 int DoSOCKSConnectComplete(int result);
143 int DoTunnelConnect();
144 int DoTunnelConnectComplete(int result);
145 int DoSSLConnect();
146 int DoSSLConnectComplete(int result);
148 // Returns the initial state for the state machine based on the
149 // |connection_type|.
150 static State GetInitialState(SSLSocketParams::ConnectionType connection_type);
152 // Starts the SSL connection process. Returns OK on success and
153 // ERR_IO_PENDING if it cannot immediately service the request.
154 // Otherwise, it returns a net error code.
155 virtual int ConnectInternal() OVERRIDE;
157 scoped_refptr<SSLSocketParams> params_;
158 TransportClientSocketPool* const transport_pool_;
159 SOCKSClientSocketPool* const socks_pool_;
160 HttpProxyClientSocketPool* const http_proxy_pool_;
161 ClientSocketFactory* const client_socket_factory_;
162 HostResolver* const host_resolver_;
164 const SSLClientSocketContext context_;
166 State next_state_;
167 CompletionCallback callback_;
168 scoped_ptr<ClientSocketHandle> transport_socket_handle_;
169 scoped_ptr<SSLClientSocket> ssl_socket_;
171 HttpResponseInfo error_response_info_;
173 DISALLOW_COPY_AND_ASSIGN(SSLConnectJob);
176 class NET_EXPORT_PRIVATE SSLClientSocketPool
177 : public ClientSocketPool,
178 public HigherLayeredPool,
179 public SSLConfigService::Observer {
180 public:
181 typedef SSLSocketParams SocketParams;
183 // Only the pools that will be used are required. i.e. if you never
184 // try to create an SSL over SOCKS socket, |socks_pool| may be NULL.
185 SSLClientSocketPool(
186 int max_sockets,
187 int max_sockets_per_group,
188 ClientSocketPoolHistograms* histograms,
189 HostResolver* host_resolver,
190 CertVerifier* cert_verifier,
191 ChannelIDService* channel_id_service,
192 TransportSecurityState* transport_security_state,
193 CTVerifier* cert_transparency_verifier,
194 const std::string& ssl_session_cache_shard,
195 ClientSocketFactory* client_socket_factory,
196 TransportClientSocketPool* transport_pool,
197 SOCKSClientSocketPool* socks_pool,
198 HttpProxyClientSocketPool* http_proxy_pool,
199 SSLConfigService* ssl_config_service,
200 NetLog* net_log);
202 virtual ~SSLClientSocketPool();
204 // ClientSocketPool implementation.
205 virtual int RequestSocket(const std::string& group_name,
206 const void* connect_params,
207 RequestPriority priority,
208 ClientSocketHandle* handle,
209 const CompletionCallback& callback,
210 const BoundNetLog& net_log) OVERRIDE;
212 virtual void RequestSockets(const std::string& group_name,
213 const void* params,
214 int num_sockets,
215 const BoundNetLog& net_log) OVERRIDE;
217 virtual void CancelRequest(const std::string& group_name,
218 ClientSocketHandle* handle) OVERRIDE;
220 virtual void ReleaseSocket(const std::string& group_name,
221 scoped_ptr<StreamSocket> socket,
222 int id) OVERRIDE;
224 virtual void FlushWithError(int error) OVERRIDE;
226 virtual void CloseIdleSockets() OVERRIDE;
228 virtual int IdleSocketCount() const OVERRIDE;
230 virtual int IdleSocketCountInGroup(
231 const std::string& group_name) const OVERRIDE;
233 virtual LoadState GetLoadState(
234 const std::string& group_name,
235 const ClientSocketHandle* handle) const OVERRIDE;
237 virtual base::DictionaryValue* GetInfoAsValue(
238 const std::string& name,
239 const std::string& type,
240 bool include_nested_pools) const OVERRIDE;
242 virtual base::TimeDelta ConnectionTimeout() const OVERRIDE;
244 virtual ClientSocketPoolHistograms* histograms() const OVERRIDE;
246 // LowerLayeredPool implementation.
247 virtual bool IsStalled() const OVERRIDE;
249 virtual void AddHigherLayeredPool(HigherLayeredPool* higher_pool) OVERRIDE;
251 virtual void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) OVERRIDE;
253 // HigherLayeredPool implementation.
254 virtual bool CloseOneIdleConnection() OVERRIDE;
256 private:
257 typedef ClientSocketPoolBase<SSLSocketParams> PoolBase;
259 // SSLConfigService::Observer implementation.
261 // When the user changes the SSL config, we flush all idle sockets so they
262 // won't get re-used.
263 virtual void OnSSLConfigChanged() OVERRIDE;
265 class SSLConnectJobFactory : public PoolBase::ConnectJobFactory {
266 public:
267 SSLConnectJobFactory(
268 TransportClientSocketPool* transport_pool,
269 SOCKSClientSocketPool* socks_pool,
270 HttpProxyClientSocketPool* http_proxy_pool,
271 ClientSocketFactory* client_socket_factory,
272 HostResolver* host_resolver,
273 const SSLClientSocketContext& context,
274 NetLog* net_log);
276 virtual ~SSLConnectJobFactory() {}
278 // ClientSocketPoolBase::ConnectJobFactory methods.
279 virtual scoped_ptr<ConnectJob> NewConnectJob(
280 const std::string& group_name,
281 const PoolBase::Request& request,
282 ConnectJob::Delegate* delegate) const OVERRIDE;
284 virtual base::TimeDelta ConnectionTimeout() const OVERRIDE;
286 private:
287 TransportClientSocketPool* const transport_pool_;
288 SOCKSClientSocketPool* const socks_pool_;
289 HttpProxyClientSocketPool* const http_proxy_pool_;
290 ClientSocketFactory* const client_socket_factory_;
291 HostResolver* const host_resolver_;
292 const SSLClientSocketContext context_;
293 base::TimeDelta timeout_;
294 NetLog* net_log_;
296 DISALLOW_COPY_AND_ASSIGN(SSLConnectJobFactory);
299 TransportClientSocketPool* const transport_pool_;
300 SOCKSClientSocketPool* const socks_pool_;
301 HttpProxyClientSocketPool* const http_proxy_pool_;
302 PoolBase base_;
303 const scoped_refptr<SSLConfigService> ssl_config_service_;
305 DISALLOW_COPY_AND_ASSIGN(SSLClientSocketPool);
308 } // namespace net
310 #endif // NET_SOCKET_SSL_CLIENT_SOCKET_POOL_H_