// 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_