15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_SOCKET_CLIENT_SOCKET_POOL_MANAGER_IMPL_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_SOCKET_CLIENT_SOCKET_POOL_MANAGER_IMPL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/template_util.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/non_thread_safe.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/cert_database.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_session.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/client_socket_pool_histograms.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/client_socket_pool_manager.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CertVerifier;
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class ChannelIDService;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClientSocketFactory;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClientSocketPoolHistograms;
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class CTVerifier;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpProxyClientSocketPool;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HostResolver;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetLog;
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ProxyDelegate;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProxyService;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SOCKSClientSocketPool;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLClientSocketPool;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLConfigService;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TransportClientSocketPool;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TransportSecurityState;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A helper class for auto-deleting Values in the destructor.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Key, typename Value>
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OwnedPoolMap : public std::map<Key, Value> {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OwnedPoolMap() {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    COMPILE_ASSERT(base::is_pointer<Value>::value,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   value_must_be_a_pointer);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~OwnedPoolMap() {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STLDeleteValues(this);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClientSocketPoolManagerImpl : public base::NonThreadSafe,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    public ClientSocketPoolManager,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    public CertDatabase::Observer {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClientSocketPoolManagerImpl(NetLog* net_log,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              ClientSocketFactory* socket_factory,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              HostResolver* host_resolver,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              CertVerifier* cert_verifier,
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                              ChannelIDService* channel_id_service,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              TransportSecurityState* transport_security_state,
67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                              CTVerifier* cert_transparency_verifier,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const std::string& ssl_session_cache_shard,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              ProxyService* proxy_service,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              SSLConfigService* ssl_config_service,
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                              bool enable_ssl_connect_job_waiting,
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              ProxyDelegate* proxy_delegate,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              HttpNetworkSession::SocketPoolType pool_type);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ClientSocketPoolManagerImpl();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void FlushSocketPoolsWithError(int error) OVERRIDE;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CloseIdleSockets() OVERRIDE;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual TransportClientSocketPool* GetTransportSocketPool() OVERRIDE;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual SSLClientSocketPool* GetSSLSocketPool() OVERRIDE;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual SOCKSClientSocketPool* GetSocketPoolForSOCKSProxy(
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const HostPortPair& socks_proxy) OVERRIDE;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual HttpProxyClientSocketPool* GetSocketPoolForHTTPProxy(
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const HostPortPair& http_proxy) OVERRIDE;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual SSLClientSocketPool* GetSocketPoolForSSLWithProxy(
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const HostPortPair& proxy_server) OVERRIDE;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a Value summary of the state of the socket pools. The caller is
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // responsible for deleting the returned value.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual base::Value* SocketPoolInfoToValue() const OVERRIDE;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CertDatabase::Observer methods:
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnCertAdded(const X509Certificate* cert) OVERRIDE;
981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void OnCACertChanged(const X509Certificate* cert) OVERRIDE;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef internal::OwnedPoolMap<HostPortPair, TransportClientSocketPool*>
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TransportSocketPoolMap;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef internal::OwnedPoolMap<HostPortPair, SOCKSClientSocketPool*>
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SOCKSSocketPoolMap;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef internal::OwnedPoolMap<HostPortPair, HttpProxyClientSocketPool*>
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HTTPProxySocketPoolMap;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef internal::OwnedPoolMap<HostPortPair, SSLClientSocketPool*>
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SSLSocketPoolMap;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetLog* const net_log_;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClientSocketFactory* const socket_factory_;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostResolver* const host_resolver_;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CertVerifier* const cert_verifier_;
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ChannelIDService* const channel_id_service_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportSecurityState* const transport_security_state_;
116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  CTVerifier* const cert_transparency_verifier_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string ssl_session_cache_shard_;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyService* const proxy_service_;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const scoped_refptr<SSLConfigService> ssl_config_service_;
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool enable_ssl_connect_job_waiting_;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HttpNetworkSession::SocketPoolType pool_type_;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: this ordering is important.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClientSocketPoolHistograms transport_pool_histograms_;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TransportClientSocketPool> transport_socket_pool_;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClientSocketPoolHistograms ssl_pool_histograms_;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<SSLClientSocketPool> ssl_socket_pool_;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClientSocketPoolHistograms transport_for_socks_pool_histograms_;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportSocketPoolMap transport_socket_pools_for_socks_proxies_;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClientSocketPoolHistograms socks_pool_histograms_;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SOCKSSocketPoolMap socks_socket_pools_;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClientSocketPoolHistograms transport_for_http_proxy_pool_histograms_;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportSocketPoolMap transport_socket_pools_for_http_proxies_;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClientSocketPoolHistograms transport_for_https_proxy_pool_histograms_;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportSocketPoolMap transport_socket_pools_for_https_proxies_;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClientSocketPoolHistograms ssl_for_https_proxy_pool_histograms_;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLSocketPoolMap ssl_socket_pools_for_https_proxies_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClientSocketPoolHistograms http_proxy_pool_histograms_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPProxySocketPoolMap http_proxy_socket_pools_;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClientSocketPoolHistograms ssl_socket_pool_for_proxies_histograms_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLSocketPoolMap ssl_socket_pools_for_proxies_;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const ProxyDelegate* proxy_delegate_;
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ClientSocketPoolManagerImpl);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_SOCKET_CLIENT_SOCKET_POOL_MANAGER_IMPL_H_
160