• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 // ClientSocketPoolManager manages access to all ClientSocketPools.  It's a
6 // simple container for all of them.  Most importantly, it handles the lifetime
7 // and destruction order properly.
8 
9 #ifndef NET_SOCKET_CLIENT_SOCKET_POOL_MANAGER_H_
10 #define NET_SOCKET_CLIENT_SOCKET_POOL_MANAGER_H_
11 #pragma once
12 
13 #include <map>
14 #include "base/basictypes.h"
15 #include "base/memory/ref_counted.h"
16 #include "base/memory/scoped_ptr.h"
17 #include "base/stl_util-inl.h"
18 #include "base/template_util.h"
19 #include "base/threading/non_thread_safe.h"
20 #include "net/base/cert_database.h"
21 #include "net/base/completion_callback.h"
22 #include "net/socket/client_socket_pool_histograms.h"
23 
24 class Value;
25 
26 namespace net {
27 
28 class BoundNetLog;
29 class CertVerifier;
30 class ClientSocketFactory;
31 class ClientSocketHandle;
32 class ClientSocketPoolHistograms;
33 class DnsCertProvenanceChecker;
34 class DnsRRResolver;
35 class HttpNetworkSession;
36 class HostPortPair;
37 class HttpProxyClientSocketPool;
38 class HostResolver;
39 class NetLog;
40 class ProxyInfo;
41 class ProxyService;
42 class SOCKSClientSocketPool;
43 class SSLClientSocketPool;
44 class SSLConfigService;
45 class SSLHostInfoFactory;
46 class TransportClientSocketPool;
47 
48 struct HttpRequestInfo;
49 struct SSLConfig;
50 
51 namespace internal {
52 
53 // A helper class for auto-deleting Values in the destructor.
54 template <typename Key, typename Value>
55 class OwnedPoolMap : public std::map<Key, Value> {
56  public:
OwnedPoolMap()57   OwnedPoolMap() {
58     COMPILE_ASSERT(base::is_pointer<Value>::value,
59                    value_must_be_a_pointer);
60   }
61 
~OwnedPoolMap()62   ~OwnedPoolMap() {
63     STLDeleteValues(this);
64   }
65 };
66 
67 }  // namespace internal
68 
69 class ClientSocketPoolManager : public base::NonThreadSafe,
70                                 public CertDatabase::Observer {
71  public:
72   ClientSocketPoolManager(NetLog* net_log,
73                           ClientSocketFactory* socket_factory,
74                           HostResolver* host_resolver,
75                           CertVerifier* cert_verifier,
76                           DnsRRResolver* dnsrr_resolver,
77                           DnsCertProvenanceChecker* dns_cert_checker,
78                           SSLHostInfoFactory* ssl_host_info_factory,
79                           ProxyService* proxy_service,
80                           SSLConfigService* ssl_config_service);
81   ~ClientSocketPoolManager();
82 
83   void FlushSocketPools();
84   void CloseIdleSockets();
85 
transport_socket_pool()86   TransportClientSocketPool* transport_socket_pool() {
87     return transport_socket_pool_.get();
88   }
89 
ssl_socket_pool()90   SSLClientSocketPool* ssl_socket_pool() { return ssl_socket_pool_.get(); }
91 
92   SOCKSClientSocketPool* GetSocketPoolForSOCKSProxy(
93       const HostPortPair& socks_proxy);
94 
95   HttpProxyClientSocketPool* GetSocketPoolForHTTPProxy(
96       const HostPortPair& http_proxy);
97 
98   SSLClientSocketPool* GetSocketPoolForSSLWithProxy(
99       const HostPortPair& proxy_server);
100 
101   static int max_sockets_per_group();
102   static void set_max_sockets_per_group(int socket_count);
103   static void set_max_sockets_per_proxy_server(int socket_count);
104 
105   // A helper method that uses the passed in proxy information to initialize a
106   // ClientSocketHandle with the relevant socket pool. Use this method for
107   // HTTP/HTTPS requests. |ssl_config_for_origin| is only used if the request
108   // uses SSL and |ssl_config_for_proxy| is used if the proxy server is HTTPS.
109   static int InitSocketHandleForHttpRequest(
110       const HttpRequestInfo& request_info,
111       HttpNetworkSession* session,
112       const ProxyInfo& proxy_info,
113       bool force_spdy_over_ssl,
114       bool want_spdy_over_npn,
115       const SSLConfig& ssl_config_for_origin,
116       const SSLConfig& ssl_config_for_proxy,
117       const BoundNetLog& net_log,
118       ClientSocketHandle* socket_handle,
119       CompletionCallback* callback);
120 
121   // A helper method that uses the passed in proxy information to initialize a
122   // ClientSocketHandle with the relevant socket pool. Use this method for
123   // a raw socket connection to a host-port pair (that needs to tunnel through
124   // the proxies).
125   static int InitSocketHandleForRawConnect(
126       const HostPortPair& host_port_pair,
127       HttpNetworkSession* session,
128       const ProxyInfo& proxy_info,
129       const SSLConfig& ssl_config_for_origin,
130       const SSLConfig& ssl_config_for_proxy,
131       const BoundNetLog& net_log,
132       ClientSocketHandle* socket_handle,
133       CompletionCallback* callback);
134 
135   // Similar to InitSocketHandleForHttpRequest except that it initiates the
136   // desired number of preconnect streams from the relevant socket pool.
137   static int PreconnectSocketsForHttpRequest(
138       const HttpRequestInfo& request_info,
139       HttpNetworkSession* session,
140       const ProxyInfo& proxy_info,
141       bool force_spdy_over_ssl,
142       bool want_spdy_over_npn,
143       const SSLConfig& ssl_config_for_origin,
144       const SSLConfig& ssl_config_for_proxy,
145       const BoundNetLog& net_log,
146       int num_preconnect_streams);
147 
148   // Creates a Value summary of the state of the socket pools. The caller is
149   // responsible for deleting the returned value.
150   Value* SocketPoolInfoToValue() const;
151 
152   // CertDatabase::Observer methods:
153   virtual void OnUserCertAdded(const X509Certificate* cert);
154   virtual void OnCertTrustChanged(const X509Certificate* cert);
155 
156  private:
157   friend class HttpNetworkSessionPeer;
158 
159   typedef internal::OwnedPoolMap<HostPortPair, TransportClientSocketPool*>
160       TransportSocketPoolMap;
161   typedef internal::OwnedPoolMap<HostPortPair, SOCKSClientSocketPool*>
162       SOCKSSocketPoolMap;
163   typedef internal::OwnedPoolMap<HostPortPair, HttpProxyClientSocketPool*>
164       HTTPProxySocketPoolMap;
165   typedef internal::OwnedPoolMap<HostPortPair, SSLClientSocketPool*>
166       SSLSocketPoolMap;
167 
168   NetLog* const net_log_;
169   ClientSocketFactory* const socket_factory_;
170   HostResolver* const host_resolver_;
171   CertVerifier* const cert_verifier_;
172   DnsRRResolver* const dnsrr_resolver_;
173   DnsCertProvenanceChecker* const dns_cert_checker_;
174   SSLHostInfoFactory* const ssl_host_info_factory_;
175   const scoped_refptr<ProxyService> proxy_service_;
176   const scoped_refptr<SSLConfigService> ssl_config_service_;
177 
178   // Note: this ordering is important.
179 
180   ClientSocketPoolHistograms transport_pool_histograms_;
181   scoped_ptr<TransportClientSocketPool> transport_socket_pool_;
182 
183   ClientSocketPoolHistograms ssl_pool_histograms_;
184   scoped_ptr<SSLClientSocketPool> ssl_socket_pool_;
185 
186   ClientSocketPoolHistograms transport_for_socks_pool_histograms_;
187   TransportSocketPoolMap transport_socket_pools_for_socks_proxies_;
188 
189   ClientSocketPoolHistograms socks_pool_histograms_;
190   SOCKSSocketPoolMap socks_socket_pools_;
191 
192   ClientSocketPoolHistograms transport_for_http_proxy_pool_histograms_;
193   TransportSocketPoolMap transport_socket_pools_for_http_proxies_;
194 
195   ClientSocketPoolHistograms transport_for_https_proxy_pool_histograms_;
196   TransportSocketPoolMap transport_socket_pools_for_https_proxies_;
197 
198   ClientSocketPoolHistograms ssl_for_https_proxy_pool_histograms_;
199   SSLSocketPoolMap ssl_socket_pools_for_https_proxies_;
200 
201   ClientSocketPoolHistograms http_proxy_pool_histograms_;
202   HTTPProxySocketPoolMap http_proxy_socket_pools_;
203 
204   ClientSocketPoolHistograms ssl_socket_pool_for_proxies_histograms_;
205   SSLSocketPoolMap ssl_socket_pools_for_proxies_;
206 
207   DISALLOW_COPY_AND_ASSIGN(ClientSocketPoolManager);
208 };
209 
210 }  // namespace net
211 
212 #endif  // NET_SOCKET_CLIENT_SOCKET_POOL_MANAGER_H_
213