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.
4
5#ifndef NET_SOCKET_CLIENT_SOCKET_POOL_MANAGER_IMPL_H_
6#define NET_SOCKET_CLIENT_SOCKET_POOL_MANAGER_IMPL_H_
7
8#include <map>
9#include "base/basictypes.h"
10#include "base/compiler_specific.h"
11#include "base/memory/ref_counted.h"
12#include "base/memory/scoped_ptr.h"
13#include "base/stl_util.h"
14#include "base/template_util.h"
15#include "base/threading/non_thread_safe.h"
16#include "net/cert/cert_database.h"
17#include "net/http/http_network_session.h"
18#include "net/socket/client_socket_pool_histograms.h"
19#include "net/socket/client_socket_pool_manager.h"
20
21namespace net {
22
23class CertVerifier;
24class ChannelIDService;
25class ClientSocketFactory;
26class ClientSocketPoolHistograms;
27class CTVerifier;
28class HttpProxyClientSocketPool;
29class HostResolver;
30class NetLog;
31class ProxyDelegate;
32class ProxyService;
33class SOCKSClientSocketPool;
34class SSLClientSocketPool;
35class SSLConfigService;
36class TransportClientSocketPool;
37class TransportSecurityState;
38
39namespace internal {
40
41// A helper class for auto-deleting Values in the destructor.
42template <typename Key, typename Value>
43class OwnedPoolMap : public std::map<Key, Value> {
44 public:
45  OwnedPoolMap() {
46    COMPILE_ASSERT(base::is_pointer<Value>::value,
47                   value_must_be_a_pointer);
48  }
49
50  ~OwnedPoolMap() {
51    STLDeleteValues(this);
52  }
53};
54
55}  // namespace internal
56
57class ClientSocketPoolManagerImpl : public base::NonThreadSafe,
58                                    public ClientSocketPoolManager,
59                                    public CertDatabase::Observer {
60 public:
61  ClientSocketPoolManagerImpl(NetLog* net_log,
62                              ClientSocketFactory* socket_factory,
63                              HostResolver* host_resolver,
64                              CertVerifier* cert_verifier,
65                              ChannelIDService* channel_id_service,
66                              TransportSecurityState* transport_security_state,
67                              CTVerifier* cert_transparency_verifier,
68                              const std::string& ssl_session_cache_shard,
69                              ProxyService* proxy_service,
70                              SSLConfigService* ssl_config_service,
71                              bool enable_ssl_connect_job_waiting,
72                              ProxyDelegate* proxy_delegate,
73                              HttpNetworkSession::SocketPoolType pool_type);
74  virtual ~ClientSocketPoolManagerImpl();
75
76  virtual void FlushSocketPoolsWithError(int error) OVERRIDE;
77  virtual void CloseIdleSockets() OVERRIDE;
78
79  virtual TransportClientSocketPool* GetTransportSocketPool() OVERRIDE;
80
81  virtual SSLClientSocketPool* GetSSLSocketPool() OVERRIDE;
82
83  virtual SOCKSClientSocketPool* GetSocketPoolForSOCKSProxy(
84      const HostPortPair& socks_proxy) OVERRIDE;
85
86  virtual HttpProxyClientSocketPool* GetSocketPoolForHTTPProxy(
87      const HostPortPair& http_proxy) OVERRIDE;
88
89  virtual SSLClientSocketPool* GetSocketPoolForSSLWithProxy(
90      const HostPortPair& proxy_server) OVERRIDE;
91
92  // Creates a Value summary of the state of the socket pools. The caller is
93  // responsible for deleting the returned value.
94  virtual base::Value* SocketPoolInfoToValue() const OVERRIDE;
95
96  // CertDatabase::Observer methods:
97  virtual void OnCertAdded(const X509Certificate* cert) OVERRIDE;
98  virtual void OnCACertChanged(const X509Certificate* cert) OVERRIDE;
99
100 private:
101  typedef internal::OwnedPoolMap<HostPortPair, TransportClientSocketPool*>
102      TransportSocketPoolMap;
103  typedef internal::OwnedPoolMap<HostPortPair, SOCKSClientSocketPool*>
104      SOCKSSocketPoolMap;
105  typedef internal::OwnedPoolMap<HostPortPair, HttpProxyClientSocketPool*>
106      HTTPProxySocketPoolMap;
107  typedef internal::OwnedPoolMap<HostPortPair, SSLClientSocketPool*>
108      SSLSocketPoolMap;
109
110  NetLog* const net_log_;
111  ClientSocketFactory* const socket_factory_;
112  HostResolver* const host_resolver_;
113  CertVerifier* const cert_verifier_;
114  ChannelIDService* const channel_id_service_;
115  TransportSecurityState* const transport_security_state_;
116  CTVerifier* const cert_transparency_verifier_;
117  const std::string ssl_session_cache_shard_;
118  ProxyService* const proxy_service_;
119  const scoped_refptr<SSLConfigService> ssl_config_service_;
120  bool enable_ssl_connect_job_waiting_;
121  const HttpNetworkSession::SocketPoolType pool_type_;
122
123  // Note: this ordering is important.
124
125  ClientSocketPoolHistograms transport_pool_histograms_;
126  scoped_ptr<TransportClientSocketPool> transport_socket_pool_;
127
128  ClientSocketPoolHistograms ssl_pool_histograms_;
129  scoped_ptr<SSLClientSocketPool> ssl_socket_pool_;
130
131  ClientSocketPoolHistograms transport_for_socks_pool_histograms_;
132  TransportSocketPoolMap transport_socket_pools_for_socks_proxies_;
133
134  ClientSocketPoolHistograms socks_pool_histograms_;
135  SOCKSSocketPoolMap socks_socket_pools_;
136
137  ClientSocketPoolHistograms transport_for_http_proxy_pool_histograms_;
138  TransportSocketPoolMap transport_socket_pools_for_http_proxies_;
139
140  ClientSocketPoolHistograms transport_for_https_proxy_pool_histograms_;
141  TransportSocketPoolMap transport_socket_pools_for_https_proxies_;
142
143  ClientSocketPoolHistograms ssl_for_https_proxy_pool_histograms_;
144  SSLSocketPoolMap ssl_socket_pools_for_https_proxies_;
145
146  ClientSocketPoolHistograms http_proxy_pool_histograms_;
147  HTTPProxySocketPoolMap http_proxy_socket_pools_;
148
149  ClientSocketPoolHistograms ssl_socket_pool_for_proxies_histograms_;
150  SSLSocketPoolMap ssl_socket_pools_for_proxies_;
151
152  const ProxyDelegate* proxy_delegate_;
153
154  DISALLOW_COPY_AND_ASSIGN(ClientSocketPoolManagerImpl);
155};
156
157}  // namespace net
158
159#endif  // NET_SOCKET_CLIENT_SOCKET_POOL_MANAGER_IMPL_H_
160