| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| // ClientSocketPoolManager manages access to all ClientSocketPools. It's a |
| // simple container for all of them. Most importantly, it handles the lifetime |
| // and destruction order properly. |
| |
| #ifndef NET_SOCKET_CLIENT_SOCKET_POOL_MANAGER_H_ |
| #define NET_SOCKET_CLIENT_SOCKET_POOL_MANAGER_H_ |
| #pragma once |
| |
| #include <map> |
| #include "base/basictypes.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/stl_util-inl.h" |
| #include "base/template_util.h" |
| #include "base/threading/non_thread_safe.h" |
| #include "net/base/cert_database.h" |
| #include "net/base/completion_callback.h" |
| #include "net/socket/client_socket_pool_histograms.h" |
| |
| class Value; |
| |
| namespace net { |
| |
| class BoundNetLog; |
| class CertVerifier; |
| class ClientSocketFactory; |
| class ClientSocketHandle; |
| class ClientSocketPoolHistograms; |
| class DnsCertProvenanceChecker; |
| class DnsRRResolver; |
| class HttpNetworkSession; |
| class HostPortPair; |
| class HttpProxyClientSocketPool; |
| class HostResolver; |
| class NetLog; |
| class ProxyInfo; |
| class ProxyService; |
| class SOCKSClientSocketPool; |
| class SSLClientSocketPool; |
| class SSLConfigService; |
| class SSLHostInfoFactory; |
| class TransportClientSocketPool; |
| |
| struct HttpRequestInfo; |
| struct SSLConfig; |
| |
| namespace internal { |
| |
| // A helper class for auto-deleting Values in the destructor. |
| template <typename Key, typename Value> |
| class OwnedPoolMap : public std::map<Key, Value> { |
| public: |
| OwnedPoolMap() { |
| COMPILE_ASSERT(base::is_pointer<Value>::value, |
| value_must_be_a_pointer); |
| } |
| |
| ~OwnedPoolMap() { |
| STLDeleteValues(this); |
| } |
| }; |
| |
| } // namespace internal |
| |
| class ClientSocketPoolManager : public base::NonThreadSafe, |
| public CertDatabase::Observer { |
| public: |
| ClientSocketPoolManager(NetLog* net_log, |
| ClientSocketFactory* socket_factory, |
| HostResolver* host_resolver, |
| CertVerifier* cert_verifier, |
| DnsRRResolver* dnsrr_resolver, |
| DnsCertProvenanceChecker* dns_cert_checker, |
| SSLHostInfoFactory* ssl_host_info_factory, |
| ProxyService* proxy_service, |
| SSLConfigService* ssl_config_service); |
| ~ClientSocketPoolManager(); |
| |
| void FlushSocketPools(); |
| void CloseIdleSockets(); |
| |
| TransportClientSocketPool* transport_socket_pool() { |
| return transport_socket_pool_.get(); |
| } |
| |
| SSLClientSocketPool* ssl_socket_pool() { return ssl_socket_pool_.get(); } |
| |
| SOCKSClientSocketPool* GetSocketPoolForSOCKSProxy( |
| const HostPortPair& socks_proxy); |
| |
| HttpProxyClientSocketPool* GetSocketPoolForHTTPProxy( |
| const HostPortPair& http_proxy); |
| |
| SSLClientSocketPool* GetSocketPoolForSSLWithProxy( |
| const HostPortPair& proxy_server); |
| |
| static int max_sockets_per_group(); |
| static void set_max_sockets_per_group(int socket_count); |
| static void set_max_sockets_per_proxy_server(int socket_count); |
| |
| // A helper method that uses the passed in proxy information to initialize a |
| // ClientSocketHandle with the relevant socket pool. Use this method for |
| // HTTP/HTTPS requests. |ssl_config_for_origin| is only used if the request |
| // uses SSL and |ssl_config_for_proxy| is used if the proxy server is HTTPS. |
| static int InitSocketHandleForHttpRequest( |
| const HttpRequestInfo& request_info, |
| HttpNetworkSession* session, |
| const ProxyInfo& proxy_info, |
| bool force_spdy_over_ssl, |
| bool want_spdy_over_npn, |
| const SSLConfig& ssl_config_for_origin, |
| const SSLConfig& ssl_config_for_proxy, |
| const BoundNetLog& net_log, |
| ClientSocketHandle* socket_handle, |
| CompletionCallback* callback); |
| |
| // A helper method that uses the passed in proxy information to initialize a |
| // ClientSocketHandle with the relevant socket pool. Use this method for |
| // a raw socket connection to a host-port pair (that needs to tunnel through |
| // the proxies). |
| static int InitSocketHandleForRawConnect( |
| const HostPortPair& host_port_pair, |
| HttpNetworkSession* session, |
| const ProxyInfo& proxy_info, |
| const SSLConfig& ssl_config_for_origin, |
| const SSLConfig& ssl_config_for_proxy, |
| const BoundNetLog& net_log, |
| ClientSocketHandle* socket_handle, |
| CompletionCallback* callback); |
| |
| // Similar to InitSocketHandleForHttpRequest except that it initiates the |
| // desired number of preconnect streams from the relevant socket pool. |
| static int PreconnectSocketsForHttpRequest( |
| const HttpRequestInfo& request_info, |
| HttpNetworkSession* session, |
| const ProxyInfo& proxy_info, |
| bool force_spdy_over_ssl, |
| bool want_spdy_over_npn, |
| const SSLConfig& ssl_config_for_origin, |
| const SSLConfig& ssl_config_for_proxy, |
| const BoundNetLog& net_log, |
| int num_preconnect_streams); |
| |
| // Creates a Value summary of the state of the socket pools. The caller is |
| // responsible for deleting the returned value. |
| Value* SocketPoolInfoToValue() const; |
| |
| // CertDatabase::Observer methods: |
| virtual void OnUserCertAdded(const X509Certificate* cert); |
| virtual void OnCertTrustChanged(const X509Certificate* cert); |
| |
| private: |
| friend class HttpNetworkSessionPeer; |
| |
| typedef internal::OwnedPoolMap<HostPortPair, TransportClientSocketPool*> |
| TransportSocketPoolMap; |
| typedef internal::OwnedPoolMap<HostPortPair, SOCKSClientSocketPool*> |
| SOCKSSocketPoolMap; |
| typedef internal::OwnedPoolMap<HostPortPair, HttpProxyClientSocketPool*> |
| HTTPProxySocketPoolMap; |
| typedef internal::OwnedPoolMap<HostPortPair, SSLClientSocketPool*> |
| SSLSocketPoolMap; |
| |
| NetLog* const net_log_; |
| ClientSocketFactory* const socket_factory_; |
| HostResolver* const host_resolver_; |
| CertVerifier* const cert_verifier_; |
| DnsRRResolver* const dnsrr_resolver_; |
| DnsCertProvenanceChecker* const dns_cert_checker_; |
| SSLHostInfoFactory* const ssl_host_info_factory_; |
| const scoped_refptr<ProxyService> proxy_service_; |
| const scoped_refptr<SSLConfigService> ssl_config_service_; |
| |
| // Note: this ordering is important. |
| |
| ClientSocketPoolHistograms transport_pool_histograms_; |
| scoped_ptr<TransportClientSocketPool> transport_socket_pool_; |
| |
| ClientSocketPoolHistograms ssl_pool_histograms_; |
| scoped_ptr<SSLClientSocketPool> ssl_socket_pool_; |
| |
| ClientSocketPoolHistograms transport_for_socks_pool_histograms_; |
| TransportSocketPoolMap transport_socket_pools_for_socks_proxies_; |
| |
| ClientSocketPoolHistograms socks_pool_histograms_; |
| SOCKSSocketPoolMap socks_socket_pools_; |
| |
| ClientSocketPoolHistograms transport_for_http_proxy_pool_histograms_; |
| TransportSocketPoolMap transport_socket_pools_for_http_proxies_; |
| |
| ClientSocketPoolHistograms transport_for_https_proxy_pool_histograms_; |
| TransportSocketPoolMap transport_socket_pools_for_https_proxies_; |
| |
| ClientSocketPoolHistograms ssl_for_https_proxy_pool_histograms_; |
| SSLSocketPoolMap ssl_socket_pools_for_https_proxies_; |
| |
| ClientSocketPoolHistograms http_proxy_pool_histograms_; |
| HTTPProxySocketPoolMap http_proxy_socket_pools_; |
| |
| ClientSocketPoolHistograms ssl_socket_pool_for_proxies_histograms_; |
| SSLSocketPoolMap ssl_socket_pools_for_proxies_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ClientSocketPoolManager); |
| }; |
| |
| } // namespace net |
| |
| #endif // NET_SOCKET_CLIENT_SOCKET_POOL_MANAGER_H_ |