OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/socket/client_socket_pool_manager_impl.h" | 5 #include "net/socket/client_socket_pool_manager_impl.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/values.h" | 8 #include "base/values.h" |
9 #include "net/http/http_network_session.h" | 9 #include "net/http/http_network_session.h" |
10 #include "net/http/http_proxy_client_socket_pool.h" | 10 #include "net/http/http_proxy_client_socket_pool.h" |
11 #include "net/socket/socks_client_socket_pool.h" | 11 #include "net/socket/socks_client_socket_pool.h" |
12 #include "net/socket/ssl_client_socket_pool.h" | 12 #include "net/socket/ssl_client_socket_pool.h" |
13 #include "net/socket/transport_client_socket_pool.h" | 13 #include "net/socket/transport_client_socket_pool.h" |
14 #include "net/ssl/ssl_config_service.h" | 14 #include "net/ssl/ssl_config_service.h" |
15 | 15 |
16 namespace net { | 16 namespace net { |
17 | 17 |
18 namespace { | 18 namespace { |
19 | 19 |
20 // Appends information about all |socket_pools| to the end of |list|. | 20 // Appends information about all |socket_pools| to the end of |list|. |
21 template <class MapType> | 21 template <class MapType> |
22 void AddSocketPoolsToList(base::ListValue* list, | 22 void AddSocketPoolsToList(base::ListValue* list, |
23 const MapType& socket_pools, | 23 const MapType& socket_pools, |
24 const std::string& type, | 24 const std::string& type, |
25 bool include_nested_pools) { | 25 bool include_nested_pools) { |
26 for (typename MapType::const_iterator it = socket_pools.begin(); | 26 for (typename MapType::const_iterator it = socket_pools.begin(); |
27 it != socket_pools.end(); it++) { | 27 it != socket_pools.end(); |
28 list->Append(it->second->GetInfoAsValue(it->first.ToString(), | 28 it++) { |
29 type, | 29 list->Append(it->second->GetInfoAsValue( |
30 include_nested_pools)); | 30 it->first.ToString(), type, include_nested_pools)); |
31 } | 31 } |
32 } | 32 } |
33 | 33 |
34 } // namespace | 34 } // namespace |
35 | 35 |
36 ClientSocketPoolManagerImpl::ClientSocketPoolManagerImpl( | 36 ClientSocketPoolManagerImpl::ClientSocketPoolManagerImpl( |
37 NetLog* net_log, | 37 NetLog* net_log, |
38 ClientSocketFactory* socket_factory, | 38 ClientSocketFactory* socket_factory, |
39 HostResolver* host_resolver, | 39 HostResolver* host_resolver, |
40 CertVerifier* cert_verifier, | 40 CertVerifier* cert_verifier, |
41 ServerBoundCertService* server_bound_cert_service, | 41 ServerBoundCertService* server_bound_cert_service, |
42 TransportSecurityState* transport_security_state, | 42 TransportSecurityState* transport_security_state, |
43 CTVerifier* cert_transparency_verifier, | 43 CTVerifier* cert_transparency_verifier, |
44 const std::string& ssl_session_cache_shard, | 44 const std::string& ssl_session_cache_shard, |
45 ProxyService* proxy_service, | 45 ProxyService* proxy_service, |
46 SSLConfigService* ssl_config_service, | 46 SSLConfigService* ssl_config_service, |
47 HttpNetworkSession::SocketPoolType pool_type) | 47 HttpNetworkSession::SocketPoolType pool_type) |
48 : net_log_(net_log), | 48 : net_log_(net_log), |
49 socket_factory_(socket_factory), | 49 socket_factory_(socket_factory), |
50 host_resolver_(host_resolver), | 50 host_resolver_(host_resolver), |
51 cert_verifier_(cert_verifier), | 51 cert_verifier_(cert_verifier), |
52 server_bound_cert_service_(server_bound_cert_service), | 52 server_bound_cert_service_(server_bound_cert_service), |
53 transport_security_state_(transport_security_state), | 53 transport_security_state_(transport_security_state), |
54 cert_transparency_verifier_(cert_transparency_verifier), | 54 cert_transparency_verifier_(cert_transparency_verifier), |
55 ssl_session_cache_shard_(ssl_session_cache_shard), | 55 ssl_session_cache_shard_(ssl_session_cache_shard), |
56 proxy_service_(proxy_service), | 56 proxy_service_(proxy_service), |
57 ssl_config_service_(ssl_config_service), | 57 ssl_config_service_(ssl_config_service), |
58 pool_type_(pool_type), | 58 pool_type_(pool_type), |
59 transport_pool_histograms_("TCP"), | 59 transport_pool_histograms_("TCP"), |
60 transport_socket_pool_(new TransportClientSocketPool( | 60 transport_socket_pool_( |
61 max_sockets_per_pool(pool_type), max_sockets_per_group(pool_type), | 61 new TransportClientSocketPool(max_sockets_per_pool(pool_type), |
62 &transport_pool_histograms_, | 62 max_sockets_per_group(pool_type), |
63 host_resolver, | 63 &transport_pool_histograms_, |
64 socket_factory_, | 64 host_resolver, |
65 net_log)), | 65 socket_factory_, |
| 66 net_log)), |
66 ssl_pool_histograms_("SSL2"), | 67 ssl_pool_histograms_("SSL2"), |
67 ssl_socket_pool_(new SSLClientSocketPool( | 68 ssl_socket_pool_(new SSLClientSocketPool(max_sockets_per_pool(pool_type), |
68 max_sockets_per_pool(pool_type), max_sockets_per_group(pool_type), | 69 max_sockets_per_group(pool_type), |
69 &ssl_pool_histograms_, | 70 &ssl_pool_histograms_, |
70 host_resolver, | 71 host_resolver, |
71 cert_verifier, | 72 cert_verifier, |
72 server_bound_cert_service, | 73 server_bound_cert_service, |
73 transport_security_state, | 74 transport_security_state, |
74 cert_transparency_verifier, | 75 cert_transparency_verifier, |
75 ssl_session_cache_shard, | 76 ssl_session_cache_shard, |
76 socket_factory, | 77 socket_factory, |
77 transport_socket_pool_.get(), | 78 transport_socket_pool_.get(), |
78 NULL /* no socks proxy */, | 79 NULL /* no socks proxy */, |
79 NULL /* no http proxy */, | 80 NULL /* no http proxy */, |
80 ssl_config_service, | 81 ssl_config_service, |
81 net_log)), | 82 net_log)), |
82 transport_for_socks_pool_histograms_("TCPforSOCKS"), | 83 transport_for_socks_pool_histograms_("TCPforSOCKS"), |
83 socks_pool_histograms_("SOCK"), | 84 socks_pool_histograms_("SOCK"), |
84 transport_for_http_proxy_pool_histograms_("TCPforHTTPProxy"), | 85 transport_for_http_proxy_pool_histograms_("TCPforHTTPProxy"), |
85 transport_for_https_proxy_pool_histograms_("TCPforHTTPSProxy"), | 86 transport_for_https_proxy_pool_histograms_("TCPforHTTPSProxy"), |
86 ssl_for_https_proxy_pool_histograms_("SSLforHTTPSProxy"), | 87 ssl_for_https_proxy_pool_histograms_("SSLforHTTPSProxy"), |
87 http_proxy_pool_histograms_("HTTPProxy"), | 88 http_proxy_pool_histograms_("HTTPProxy"), |
88 ssl_socket_pool_for_proxies_histograms_("SSLForProxies") { | 89 ssl_socket_pool_for_proxies_histograms_("SSLForProxies") { |
89 CertDatabase::GetInstance()->AddObserver(this); | 90 CertDatabase::GetInstance()->AddObserver(this); |
90 } | 91 } |
91 | 92 |
92 ClientSocketPoolManagerImpl::~ClientSocketPoolManagerImpl() { | 93 ClientSocketPoolManagerImpl::~ClientSocketPoolManagerImpl() { |
93 CertDatabase::GetInstance()->RemoveObserver(this); | 94 CertDatabase::GetInstance()->RemoveObserver(this); |
94 } | 95 } |
95 | 96 |
96 void ClientSocketPoolManagerImpl::FlushSocketPoolsWithError(int error) { | 97 void ClientSocketPoolManagerImpl::FlushSocketPoolsWithError(int error) { |
97 // Flush the highest level pools first, since higher level pools may release | 98 // Flush the highest level pools first, since higher level pools may release |
98 // stuff to the lower level pools. | 99 // stuff to the lower level pools. |
99 | 100 |
100 for (SSLSocketPoolMap::const_iterator it = | 101 for (SSLSocketPoolMap::const_iterator it = |
101 ssl_socket_pools_for_proxies_.begin(); | 102 ssl_socket_pools_for_proxies_.begin(); |
102 it != ssl_socket_pools_for_proxies_.end(); | 103 it != ssl_socket_pools_for_proxies_.end(); |
103 ++it) | 104 ++it) |
104 it->second->FlushWithError(error); | 105 it->second->FlushWithError(error); |
105 | 106 |
106 for (HTTPProxySocketPoolMap::const_iterator it = | 107 for (HTTPProxySocketPoolMap::const_iterator it = |
107 http_proxy_socket_pools_.begin(); | 108 http_proxy_socket_pools_.begin(); |
108 it != http_proxy_socket_pools_.end(); | 109 it != http_proxy_socket_pools_.end(); |
109 ++it) | 110 ++it) |
110 it->second->FlushWithError(error); | 111 it->second->FlushWithError(error); |
111 | 112 |
112 for (SSLSocketPoolMap::const_iterator it = | 113 for (SSLSocketPoolMap::const_iterator it = |
113 ssl_socket_pools_for_https_proxies_.begin(); | 114 ssl_socket_pools_for_https_proxies_.begin(); |
114 it != ssl_socket_pools_for_https_proxies_.end(); | 115 it != ssl_socket_pools_for_https_proxies_.end(); |
115 ++it) | 116 ++it) |
116 it->second->FlushWithError(error); | 117 it->second->FlushWithError(error); |
117 | 118 |
118 for (TransportSocketPoolMap::const_iterator it = | 119 for (TransportSocketPoolMap::const_iterator it = |
119 transport_socket_pools_for_https_proxies_.begin(); | 120 transport_socket_pools_for_https_proxies_.begin(); |
120 it != transport_socket_pools_for_https_proxies_.end(); | 121 it != transport_socket_pools_for_https_proxies_.end(); |
121 ++it) | 122 ++it) |
122 it->second->FlushWithError(error); | 123 it->second->FlushWithError(error); |
123 | 124 |
124 for (TransportSocketPoolMap::const_iterator it = | 125 for (TransportSocketPoolMap::const_iterator it = |
125 transport_socket_pools_for_http_proxies_.begin(); | 126 transport_socket_pools_for_http_proxies_.begin(); |
126 it != transport_socket_pools_for_http_proxies_.end(); | 127 it != transport_socket_pools_for_http_proxies_.end(); |
127 ++it) | 128 ++it) |
128 it->second->FlushWithError(error); | 129 it->second->FlushWithError(error); |
129 | 130 |
130 for (SOCKSSocketPoolMap::const_iterator it = | 131 for (SOCKSSocketPoolMap::const_iterator it = socks_socket_pools_.begin(); |
131 socks_socket_pools_.begin(); | |
132 it != socks_socket_pools_.end(); | 132 it != socks_socket_pools_.end(); |
133 ++it) | 133 ++it) |
134 it->second->FlushWithError(error); | 134 it->second->FlushWithError(error); |
135 | 135 |
136 for (TransportSocketPoolMap::const_iterator it = | 136 for (TransportSocketPoolMap::const_iterator it = |
137 transport_socket_pools_for_socks_proxies_.begin(); | 137 transport_socket_pools_for_socks_proxies_.begin(); |
138 it != transport_socket_pools_for_socks_proxies_.end(); | 138 it != transport_socket_pools_for_socks_proxies_.end(); |
139 ++it) | 139 ++it) |
140 it->second->FlushWithError(error); | 140 it->second->FlushWithError(error); |
141 | 141 |
142 ssl_socket_pool_->FlushWithError(error); | 142 ssl_socket_pool_->FlushWithError(error); |
143 transport_socket_pool_->FlushWithError(error); | 143 transport_socket_pool_->FlushWithError(error); |
144 } | 144 } |
145 | 145 |
146 void ClientSocketPoolManagerImpl::CloseIdleSockets() { | 146 void ClientSocketPoolManagerImpl::CloseIdleSockets() { |
147 // Close sockets in the highest level pools first, since higher level pools' | 147 // Close sockets in the highest level pools first, since higher level pools' |
148 // sockets may release stuff to the lower level pools. | 148 // sockets may release stuff to the lower level pools. |
149 for (SSLSocketPoolMap::const_iterator it = | 149 for (SSLSocketPoolMap::const_iterator it = |
150 ssl_socket_pools_for_proxies_.begin(); | 150 ssl_socket_pools_for_proxies_.begin(); |
151 it != ssl_socket_pools_for_proxies_.end(); | 151 it != ssl_socket_pools_for_proxies_.end(); |
152 ++it) | 152 ++it) |
153 it->second->CloseIdleSockets(); | 153 it->second->CloseIdleSockets(); |
154 | 154 |
155 for (HTTPProxySocketPoolMap::const_iterator it = | 155 for (HTTPProxySocketPoolMap::const_iterator it = |
156 http_proxy_socket_pools_.begin(); | 156 http_proxy_socket_pools_.begin(); |
157 it != http_proxy_socket_pools_.end(); | 157 it != http_proxy_socket_pools_.end(); |
158 ++it) | 158 ++it) |
159 it->second->CloseIdleSockets(); | 159 it->second->CloseIdleSockets(); |
160 | 160 |
161 for (SSLSocketPoolMap::const_iterator it = | 161 for (SSLSocketPoolMap::const_iterator it = |
162 ssl_socket_pools_for_https_proxies_.begin(); | 162 ssl_socket_pools_for_https_proxies_.begin(); |
163 it != ssl_socket_pools_for_https_proxies_.end(); | 163 it != ssl_socket_pools_for_https_proxies_.end(); |
164 ++it) | 164 ++it) |
165 it->second->CloseIdleSockets(); | 165 it->second->CloseIdleSockets(); |
166 | 166 |
167 for (TransportSocketPoolMap::const_iterator it = | 167 for (TransportSocketPoolMap::const_iterator it = |
168 transport_socket_pools_for_https_proxies_.begin(); | 168 transport_socket_pools_for_https_proxies_.begin(); |
169 it != transport_socket_pools_for_https_proxies_.end(); | 169 it != transport_socket_pools_for_https_proxies_.end(); |
170 ++it) | 170 ++it) |
171 it->second->CloseIdleSockets(); | 171 it->second->CloseIdleSockets(); |
172 | 172 |
173 for (TransportSocketPoolMap::const_iterator it = | 173 for (TransportSocketPoolMap::const_iterator it = |
174 transport_socket_pools_for_http_proxies_.begin(); | 174 transport_socket_pools_for_http_proxies_.begin(); |
175 it != transport_socket_pools_for_http_proxies_.end(); | 175 it != transport_socket_pools_for_http_proxies_.end(); |
176 ++it) | 176 ++it) |
177 it->second->CloseIdleSockets(); | 177 it->second->CloseIdleSockets(); |
178 | 178 |
179 for (SOCKSSocketPoolMap::const_iterator it = | 179 for (SOCKSSocketPoolMap::const_iterator it = socks_socket_pools_.begin(); |
180 socks_socket_pools_.begin(); | |
181 it != socks_socket_pools_.end(); | 180 it != socks_socket_pools_.end(); |
182 ++it) | 181 ++it) |
183 it->second->CloseIdleSockets(); | 182 it->second->CloseIdleSockets(); |
184 | 183 |
185 for (TransportSocketPoolMap::const_iterator it = | 184 for (TransportSocketPoolMap::const_iterator it = |
186 transport_socket_pools_for_socks_proxies_.begin(); | 185 transport_socket_pools_for_socks_proxies_.begin(); |
187 it != transport_socket_pools_for_socks_proxies_.end(); | 186 it != transport_socket_pools_for_socks_proxies_.end(); |
188 ++it) | 187 ++it) |
189 it->second->CloseIdleSockets(); | 188 it->second->CloseIdleSockets(); |
190 | 189 |
191 ssl_socket_pool_->CloseIdleSockets(); | 190 ssl_socket_pool_->CloseIdleSockets(); |
192 transport_socket_pool_->CloseIdleSockets(); | 191 transport_socket_pool_->CloseIdleSockets(); |
193 } | 192 } |
194 | 193 |
195 TransportClientSocketPool* | 194 TransportClientSocketPool* |
196 ClientSocketPoolManagerImpl::GetTransportSocketPool() { | 195 ClientSocketPoolManagerImpl::GetTransportSocketPool() { |
197 return transport_socket_pool_.get(); | 196 return transport_socket_pool_.get(); |
198 } | 197 } |
199 | 198 |
200 SSLClientSocketPool* ClientSocketPoolManagerImpl::GetSSLSocketPool() { | 199 SSLClientSocketPool* ClientSocketPoolManagerImpl::GetSSLSocketPool() { |
201 return ssl_socket_pool_.get(); | 200 return ssl_socket_pool_.get(); |
202 } | 201 } |
203 | 202 |
204 SOCKSClientSocketPool* ClientSocketPoolManagerImpl::GetSocketPoolForSOCKSProxy( | 203 SOCKSClientSocketPool* ClientSocketPoolManagerImpl::GetSocketPoolForSOCKSProxy( |
205 const HostPortPair& socks_proxy) { | 204 const HostPortPair& socks_proxy) { |
206 SOCKSSocketPoolMap::const_iterator it = socks_socket_pools_.find(socks_proxy); | 205 SOCKSSocketPoolMap::const_iterator it = socks_socket_pools_.find(socks_proxy); |
207 if (it != socks_socket_pools_.end()) { | 206 if (it != socks_socket_pools_.end()) { |
208 DCHECK(ContainsKey(transport_socket_pools_for_socks_proxies_, socks_proxy)); | 207 DCHECK(ContainsKey(transport_socket_pools_for_socks_proxies_, socks_proxy)); |
209 return it->second; | 208 return it->second; |
210 } | 209 } |
211 | 210 |
212 DCHECK(!ContainsKey(transport_socket_pools_for_socks_proxies_, socks_proxy)); | 211 DCHECK(!ContainsKey(transport_socket_pools_for_socks_proxies_, socks_proxy)); |
213 | 212 |
214 std::pair<TransportSocketPoolMap::iterator, bool> tcp_ret = | 213 std::pair<TransportSocketPoolMap::iterator, bool> tcp_ret = |
215 transport_socket_pools_for_socks_proxies_.insert( | 214 transport_socket_pools_for_socks_proxies_.insert( |
216 std::make_pair( | 215 std::make_pair(socks_proxy, |
217 socks_proxy, | 216 new TransportClientSocketPool( |
218 new TransportClientSocketPool( | 217 max_sockets_per_proxy_server(pool_type_), |
219 max_sockets_per_proxy_server(pool_type_), | 218 max_sockets_per_group(pool_type_), |
220 max_sockets_per_group(pool_type_), | 219 &transport_for_socks_pool_histograms_, |
221 &transport_for_socks_pool_histograms_, | 220 host_resolver_, |
222 host_resolver_, | 221 socket_factory_, |
223 socket_factory_, | 222 net_log_))); |
224 net_log_))); | |
225 DCHECK(tcp_ret.second); | 223 DCHECK(tcp_ret.second); |
226 | 224 |
227 std::pair<SOCKSSocketPoolMap::iterator, bool> ret = | 225 std::pair<SOCKSSocketPoolMap::iterator, bool> ret = |
228 socks_socket_pools_.insert( | 226 socks_socket_pools_.insert(std::make_pair( |
229 std::make_pair(socks_proxy, new SOCKSClientSocketPool( | 227 socks_proxy, |
230 max_sockets_per_proxy_server(pool_type_), | 228 new SOCKSClientSocketPool(max_sockets_per_proxy_server(pool_type_), |
231 max_sockets_per_group(pool_type_), | 229 max_sockets_per_group(pool_type_), |
232 &socks_pool_histograms_, | 230 &socks_pool_histograms_, |
233 host_resolver_, | 231 host_resolver_, |
234 tcp_ret.first->second, | 232 tcp_ret.first->second, |
235 net_log_))); | 233 net_log_))); |
236 | 234 |
237 return ret.first->second; | 235 return ret.first->second; |
238 } | 236 } |
239 | 237 |
240 HttpProxyClientSocketPool* | 238 HttpProxyClientSocketPool* |
241 ClientSocketPoolManagerImpl::GetSocketPoolForHTTPProxy( | 239 ClientSocketPoolManagerImpl::GetSocketPoolForHTTPProxy( |
242 const HostPortPair& http_proxy) { | 240 const HostPortPair& http_proxy) { |
243 HTTPProxySocketPoolMap::const_iterator it = | 241 HTTPProxySocketPoolMap::const_iterator it = |
244 http_proxy_socket_pools_.find(http_proxy); | 242 http_proxy_socket_pools_.find(http_proxy); |
245 if (it != http_proxy_socket_pools_.end()) { | 243 if (it != http_proxy_socket_pools_.end()) { |
246 DCHECK(ContainsKey(transport_socket_pools_for_http_proxies_, http_proxy)); | 244 DCHECK(ContainsKey(transport_socket_pools_for_http_proxies_, http_proxy)); |
247 DCHECK(ContainsKey(transport_socket_pools_for_https_proxies_, http_proxy)); | 245 DCHECK(ContainsKey(transport_socket_pools_for_https_proxies_, http_proxy)); |
248 DCHECK(ContainsKey(ssl_socket_pools_for_https_proxies_, http_proxy)); | 246 DCHECK(ContainsKey(ssl_socket_pools_for_https_proxies_, http_proxy)); |
249 return it->second; | 247 return it->second; |
250 } | 248 } |
251 | 249 |
252 DCHECK(!ContainsKey(transport_socket_pools_for_http_proxies_, http_proxy)); | 250 DCHECK(!ContainsKey(transport_socket_pools_for_http_proxies_, http_proxy)); |
253 DCHECK(!ContainsKey(transport_socket_pools_for_https_proxies_, http_proxy)); | 251 DCHECK(!ContainsKey(transport_socket_pools_for_https_proxies_, http_proxy)); |
254 DCHECK(!ContainsKey(ssl_socket_pools_for_https_proxies_, http_proxy)); | 252 DCHECK(!ContainsKey(ssl_socket_pools_for_https_proxies_, http_proxy)); |
255 | 253 |
256 std::pair<TransportSocketPoolMap::iterator, bool> tcp_http_ret = | 254 std::pair<TransportSocketPoolMap::iterator, bool> tcp_http_ret = |
257 transport_socket_pools_for_http_proxies_.insert( | 255 transport_socket_pools_for_http_proxies_.insert( |
258 std::make_pair( | 256 std::make_pair(http_proxy, |
259 http_proxy, | 257 new TransportClientSocketPool( |
260 new TransportClientSocketPool( | 258 max_sockets_per_proxy_server(pool_type_), |
261 max_sockets_per_proxy_server(pool_type_), | 259 max_sockets_per_group(pool_type_), |
262 max_sockets_per_group(pool_type_), | 260 &transport_for_http_proxy_pool_histograms_, |
263 &transport_for_http_proxy_pool_histograms_, | 261 host_resolver_, |
264 host_resolver_, | 262 socket_factory_, |
265 socket_factory_, | 263 net_log_))); |
266 net_log_))); | |
267 DCHECK(tcp_http_ret.second); | 264 DCHECK(tcp_http_ret.second); |
268 | 265 |
269 std::pair<TransportSocketPoolMap::iterator, bool> tcp_https_ret = | 266 std::pair<TransportSocketPoolMap::iterator, bool> tcp_https_ret = |
270 transport_socket_pools_for_https_proxies_.insert( | 267 transport_socket_pools_for_https_proxies_.insert( |
271 std::make_pair( | 268 std::make_pair(http_proxy, |
272 http_proxy, | 269 new TransportClientSocketPool( |
273 new TransportClientSocketPool( | 270 max_sockets_per_proxy_server(pool_type_), |
274 max_sockets_per_proxy_server(pool_type_), | 271 max_sockets_per_group(pool_type_), |
275 max_sockets_per_group(pool_type_), | 272 &transport_for_https_proxy_pool_histograms_, |
276 &transport_for_https_proxy_pool_histograms_, | 273 host_resolver_, |
277 host_resolver_, | 274 socket_factory_, |
278 socket_factory_, | 275 net_log_))); |
279 net_log_))); | |
280 DCHECK(tcp_https_ret.second); | 276 DCHECK(tcp_https_ret.second); |
281 | 277 |
282 std::pair<SSLSocketPoolMap::iterator, bool> ssl_https_ret = | 278 std::pair<SSLSocketPoolMap::iterator, bool> ssl_https_ret = |
283 ssl_socket_pools_for_https_proxies_.insert(std::make_pair( | 279 ssl_socket_pools_for_https_proxies_.insert(std::make_pair( |
284 http_proxy, | 280 http_proxy, |
285 new SSLClientSocketPool(max_sockets_per_proxy_server(pool_type_), | 281 new SSLClientSocketPool(max_sockets_per_proxy_server(pool_type_), |
286 max_sockets_per_group(pool_type_), | 282 max_sockets_per_group(pool_type_), |
287 &ssl_for_https_proxy_pool_histograms_, | 283 &ssl_for_https_proxy_pool_histograms_, |
288 host_resolver_, | 284 host_resolver_, |
289 cert_verifier_, | 285 cert_verifier_, |
290 server_bound_cert_service_, | 286 server_bound_cert_service_, |
291 transport_security_state_, | 287 transport_security_state_, |
292 cert_transparency_verifier_, | 288 cert_transparency_verifier_, |
293 ssl_session_cache_shard_, | 289 ssl_session_cache_shard_, |
294 socket_factory_, | 290 socket_factory_, |
295 tcp_https_ret.first->second /* https proxy */, | 291 tcp_https_ret.first->second /* https proxy */, |
296 NULL /* no socks proxy */, | 292 NULL /* no socks proxy */, |
297 NULL /* no http proxy */, | 293 NULL /* no http proxy */, |
298 ssl_config_service_.get(), | 294 ssl_config_service_.get(), |
299 net_log_))); | 295 net_log_))); |
300 DCHECK(tcp_https_ret.second); | 296 DCHECK(tcp_https_ret.second); |
301 | 297 |
302 std::pair<HTTPProxySocketPoolMap::iterator, bool> ret = | 298 std::pair<HTTPProxySocketPoolMap::iterator, bool> ret = |
303 http_proxy_socket_pools_.insert( | 299 http_proxy_socket_pools_.insert( |
304 std::make_pair( | 300 std::make_pair(http_proxy, |
305 http_proxy, | 301 new HttpProxyClientSocketPool( |
306 new HttpProxyClientSocketPool( | 302 max_sockets_per_proxy_server(pool_type_), |
307 max_sockets_per_proxy_server(pool_type_), | 303 max_sockets_per_group(pool_type_), |
308 max_sockets_per_group(pool_type_), | 304 &http_proxy_pool_histograms_, |
309 &http_proxy_pool_histograms_, | 305 host_resolver_, |
310 host_resolver_, | 306 tcp_http_ret.first->second, |
311 tcp_http_ret.first->second, | 307 ssl_https_ret.first->second, |
312 ssl_https_ret.first->second, | 308 net_log_))); |
313 net_log_))); | |
314 | 309 |
315 return ret.first->second; | 310 return ret.first->second; |
316 } | 311 } |
317 | 312 |
318 SSLClientSocketPool* ClientSocketPoolManagerImpl::GetSocketPoolForSSLWithProxy( | 313 SSLClientSocketPool* ClientSocketPoolManagerImpl::GetSocketPoolForSSLWithProxy( |
319 const HostPortPair& proxy_server) { | 314 const HostPortPair& proxy_server) { |
320 SSLSocketPoolMap::const_iterator it = | 315 SSLSocketPoolMap::const_iterator it = |
321 ssl_socket_pools_for_proxies_.find(proxy_server); | 316 ssl_socket_pools_for_proxies_.find(proxy_server); |
322 if (it != ssl_socket_pools_for_proxies_.end()) | 317 if (it != ssl_socket_pools_for_proxies_.end()) |
323 return it->second; | 318 return it->second; |
324 | 319 |
325 SSLClientSocketPool* new_pool = new SSLClientSocketPool( | 320 SSLClientSocketPool* new_pool = new SSLClientSocketPool( |
326 max_sockets_per_proxy_server(pool_type_), | 321 max_sockets_per_proxy_server(pool_type_), |
327 max_sockets_per_group(pool_type_), | 322 max_sockets_per_group(pool_type_), |
328 &ssl_pool_histograms_, | 323 &ssl_pool_histograms_, |
329 host_resolver_, | 324 host_resolver_, |
330 cert_verifier_, | 325 cert_verifier_, |
331 server_bound_cert_service_, | 326 server_bound_cert_service_, |
332 transport_security_state_, | 327 transport_security_state_, |
333 cert_transparency_verifier_, | 328 cert_transparency_verifier_, |
334 ssl_session_cache_shard_, | 329 ssl_session_cache_shard_, |
335 socket_factory_, | 330 socket_factory_, |
336 NULL, /* no tcp pool, we always go through a proxy */ | 331 NULL, /* no tcp pool, we always go through a proxy */ |
337 GetSocketPoolForSOCKSProxy(proxy_server), | 332 GetSocketPoolForSOCKSProxy(proxy_server), |
338 GetSocketPoolForHTTPProxy(proxy_server), | 333 GetSocketPoolForHTTPProxy(proxy_server), |
339 ssl_config_service_.get(), | 334 ssl_config_service_.get(), |
340 net_log_); | 335 net_log_); |
341 | 336 |
342 std::pair<SSLSocketPoolMap::iterator, bool> ret = | 337 std::pair<SSLSocketPoolMap::iterator, bool> ret = |
343 ssl_socket_pools_for_proxies_.insert(std::make_pair(proxy_server, | 338 ssl_socket_pools_for_proxies_.insert( |
344 new_pool)); | 339 std::make_pair(proxy_server, new_pool)); |
345 | 340 |
346 return ret.first->second; | 341 return ret.first->second; |
347 } | 342 } |
348 | 343 |
349 base::Value* ClientSocketPoolManagerImpl::SocketPoolInfoToValue() const { | 344 base::Value* ClientSocketPoolManagerImpl::SocketPoolInfoToValue() const { |
350 base::ListValue* list = new base::ListValue(); | 345 base::ListValue* list = new base::ListValue(); |
351 list->Append(transport_socket_pool_->GetInfoAsValue("transport_socket_pool", | 346 list->Append(transport_socket_pool_->GetInfoAsValue( |
352 "transport_socket_pool", | 347 "transport_socket_pool", "transport_socket_pool", false)); |
353 false)); | |
354 // Third parameter is false because |ssl_socket_pool_| uses | 348 // Third parameter is false because |ssl_socket_pool_| uses |
355 // |transport_socket_pool_| internally, and do not want to add it a second | 349 // |transport_socket_pool_| internally, and do not want to add it a second |
356 // time. | 350 // time. |
357 list->Append(ssl_socket_pool_->GetInfoAsValue("ssl_socket_pool", | 351 list->Append(ssl_socket_pool_->GetInfoAsValue( |
358 "ssl_socket_pool", | 352 "ssl_socket_pool", "ssl_socket_pool", false)); |
359 false)); | 353 AddSocketPoolsToList( |
360 AddSocketPoolsToList(list, | 354 list, http_proxy_socket_pools_, "http_proxy_socket_pool", true); |
361 http_proxy_socket_pools_, | 355 AddSocketPoolsToList(list, socks_socket_pools_, "socks_socket_pool", true); |
362 "http_proxy_socket_pool", | |
363 true); | |
364 AddSocketPoolsToList(list, | |
365 socks_socket_pools_, | |
366 "socks_socket_pool", | |
367 true); | |
368 | 356 |
369 // Third parameter is false because |ssl_socket_pools_for_proxies_| use | 357 // Third parameter is false because |ssl_socket_pools_for_proxies_| use |
370 // socket pools in |http_proxy_socket_pools_| and |socks_socket_pools_|. | 358 // socket pools in |http_proxy_socket_pools_| and |socks_socket_pools_|. |
371 AddSocketPoolsToList(list, | 359 AddSocketPoolsToList(list, |
372 ssl_socket_pools_for_proxies_, | 360 ssl_socket_pools_for_proxies_, |
373 "ssl_socket_pool_for_proxies", | 361 "ssl_socket_pool_for_proxies", |
374 false); | 362 false); |
375 return list; | 363 return list; |
376 } | 364 } |
377 | 365 |
378 void ClientSocketPoolManagerImpl::OnCertAdded(const X509Certificate* cert) { | 366 void ClientSocketPoolManagerImpl::OnCertAdded(const X509Certificate* cert) { |
379 FlushSocketPoolsWithError(ERR_NETWORK_CHANGED); | 367 FlushSocketPoolsWithError(ERR_NETWORK_CHANGED); |
380 } | 368 } |
381 | 369 |
382 void ClientSocketPoolManagerImpl::OnCACertChanged( | 370 void ClientSocketPoolManagerImpl::OnCACertChanged(const X509Certificate* cert) { |
383 const X509Certificate* cert) { | |
384 // We should flush the socket pools if we removed trust from a | 371 // We should flush the socket pools if we removed trust from a |
385 // cert, because a previously trusted server may have become | 372 // cert, because a previously trusted server may have become |
386 // untrusted. | 373 // untrusted. |
387 // | 374 // |
388 // We should not flush the socket pools if we added trust to a | 375 // We should not flush the socket pools if we added trust to a |
389 // cert. | 376 // cert. |
390 // | 377 // |
391 // Since the OnCACertChanged method doesn't tell us what | 378 // Since the OnCACertChanged method doesn't tell us what |
392 // kind of change it is, we have to flush the socket | 379 // kind of change it is, we have to flush the socket |
393 // pools to be safe. | 380 // pools to be safe. |
394 FlushSocketPoolsWithError(ERR_NETWORK_CHANGED); | 381 FlushSocketPoolsWithError(ERR_NETWORK_CHANGED); |
395 } | 382 } |
396 | 383 |
397 } // namespace net | 384 } // namespace net |
OLD | NEW |