| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 // | |
| 5 // ClientSocketPoolManager manages access to all ClientSocketPools. It's a | |
| 6 // simple container for all of them. Most importantly, it handles the lifetime | |
| 7 // and destruction order properly. | |
| 8 | 4 |
| 9 #include "net/socket/client_socket_pool_manager.h" | 5 #include "net/socket/client_socket_pool_manager.h" |
| 10 | 6 |
| 11 #include <string> | 7 #include <string> |
| 12 | 8 |
| 13 #include "base/logging.h" | 9 #include "base/logging.h" |
| 14 #include "base/stringprintf.h" | 10 #include "base/stringprintf.h" |
| 15 #include "base/values.h" | 11 #include "net/base/load_flags.h" |
| 16 #include "net/base/ssl_config_service.h" | |
| 17 #include "net/http/http_network_session.h" | 12 #include "net/http/http_network_session.h" |
| 18 #include "net/http/http_proxy_client_socket_pool.h" | 13 #include "net/http/http_proxy_client_socket_pool.h" |
| 19 #include "net/http/http_request_info.h" | 14 #include "net/http/http_request_info.h" |
| 20 #include "net/proxy/proxy_service.h" | 15 #include "net/proxy/proxy_info.h" |
| 21 #include "net/socket/client_socket_factory.h" | |
| 22 #include "net/socket/client_socket_handle.h" | 16 #include "net/socket/client_socket_handle.h" |
| 23 #include "net/socket/client_socket_pool_histograms.h" | |
| 24 #include "net/socket/socks_client_socket_pool.h" | 17 #include "net/socket/socks_client_socket_pool.h" |
| 25 #include "net/socket/ssl_client_socket_pool.h" | 18 #include "net/socket/ssl_client_socket_pool.h" |
| 26 #include "net/socket/transport_client_socket_pool.h" | 19 #include "net/socket/transport_client_socket_pool.h" |
| 27 | 20 |
| 28 namespace net { | 21 namespace net { |
| 29 | 22 |
| 30 namespace { | 23 namespace { |
| 31 | 24 |
| 32 // Limit of sockets of each socket pool. | 25 // Limit of sockets of each socket pool. |
| 33 int g_max_sockets_per_pool = 256; | 26 int g_max_sockets_per_pool = 256; |
| 34 | 27 |
| 35 // Default to allow up to 6 connections per host. Experiment and tuning may | 28 // Default to allow up to 6 connections per host. Experiment and tuning may |
| 36 // try other values (greater than 0). Too large may cause many problems, such | 29 // try other values (greater than 0). Too large may cause many problems, such |
| 37 // as home routers blocking the connections!?!? See http://crbug.com/12066. | 30 // as home routers blocking the connections!?!? See http://crbug.com/12066. |
| 38 int g_max_sockets_per_group = 6; | 31 int g_max_sockets_per_group = 6; |
| 39 | 32 |
| 40 // The max number of sockets to allow per proxy server. This applies both to | 33 // The max number of sockets to allow per proxy server. This applies both to |
| 41 // http and SOCKS proxies. See http://crbug.com/12066 and | 34 // http and SOCKS proxies. See http://crbug.com/12066 and |
| 42 // http://crbug.com/44501 for details about proxy server connection limits. | 35 // http://crbug.com/44501 for details about proxy server connection limits. |
| 43 int g_max_sockets_per_proxy_server = kDefaultMaxSocketsPerProxyServer; | 36 int g_max_sockets_per_proxy_server = kDefaultMaxSocketsPerProxyServer; |
| 44 | 37 |
| 45 // Appends information about all |socket_pools| to the end of |list|. | |
| 46 template <class MapType> | |
| 47 static void AddSocketPoolsToList(ListValue* list, | |
| 48 const MapType& socket_pools, | |
| 49 const std::string& type, | |
| 50 bool include_nested_pools) { | |
| 51 for (typename MapType::const_iterator it = socket_pools.begin(); | |
| 52 it != socket_pools.end(); it++) { | |
| 53 list->Append(it->second->GetInfoAsValue(it->first.ToString(), | |
| 54 type, | |
| 55 include_nested_pools)); | |
| 56 } | |
| 57 } | |
| 58 | |
| 59 // The meat of the implementation for the InitSocketHandleForHttpRequest, | 38 // The meat of the implementation for the InitSocketHandleForHttpRequest, |
| 60 // InitSocketHandleForRawConnect and PreconnectSocketsForHttpRequest methods. | 39 // InitSocketHandleForRawConnect and PreconnectSocketsForHttpRequest methods. |
| 61 int InitSocketPoolHelper(const GURL& request_url, | 40 int InitSocketPoolHelper(const GURL& request_url, |
| 62 const HttpRequestHeaders& request_extra_headers, | 41 const HttpRequestHeaders& request_extra_headers, |
| 63 int request_load_flags, | 42 int request_load_flags, |
| 64 RequestPriority request_priority, | 43 RequestPriority request_priority, |
| 65 HttpNetworkSession* session, | 44 HttpNetworkSession* session, |
| 66 const ProxyInfo& proxy_info, | 45 const ProxyInfo& proxy_info, |
| 67 bool force_spdy_over_ssl, | 46 bool force_spdy_over_ssl, |
| 68 bool want_spdy_over_npn, | 47 bool want_spdy_over_npn, |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 return OK; | 214 return OK; |
| 236 } | 215 } |
| 237 | 216 |
| 238 return socket_handle->Init(connection_group, tcp_params, | 217 return socket_handle->Init(connection_group, tcp_params, |
| 239 request_priority, callback, | 218 request_priority, callback, |
| 240 pool, net_log); | 219 pool, net_log); |
| 241 } | 220 } |
| 242 | 221 |
| 243 } // namespace | 222 } // namespace |
| 244 | 223 |
| 245 ClientSocketPoolManager::ClientSocketPoolManager( | 224 ClientSocketPoolManager::ClientSocketPoolManager() {} |
| 246 NetLog* net_log, | 225 ClientSocketPoolManager::~ClientSocketPoolManager() {} |
| 247 ClientSocketFactory* socket_factory, | |
| 248 HostResolver* host_resolver, | |
| 249 CertVerifier* cert_verifier, | |
| 250 OriginBoundCertService* origin_bound_cert_service, | |
| 251 DnsRRResolver* dnsrr_resolver, | |
| 252 DnsCertProvenanceChecker* dns_cert_checker, | |
| 253 SSLHostInfoFactory* ssl_host_info_factory, | |
| 254 ProxyService* proxy_service, | |
| 255 SSLConfigService* ssl_config_service) | |
| 256 : net_log_(net_log), | |
| 257 socket_factory_(socket_factory), | |
| 258 host_resolver_(host_resolver), | |
| 259 cert_verifier_(cert_verifier), | |
| 260 origin_bound_cert_service_(origin_bound_cert_service), | |
| 261 dnsrr_resolver_(dnsrr_resolver), | |
| 262 dns_cert_checker_(dns_cert_checker), | |
| 263 ssl_host_info_factory_(ssl_host_info_factory), | |
| 264 proxy_service_(proxy_service), | |
| 265 ssl_config_service_(ssl_config_service), | |
| 266 transport_pool_histograms_("TCP"), | |
| 267 transport_socket_pool_(new TransportClientSocketPool( | |
| 268 g_max_sockets_per_pool, g_max_sockets_per_group, | |
| 269 &transport_pool_histograms_, | |
| 270 host_resolver, | |
| 271 socket_factory_, | |
| 272 net_log)), | |
| 273 ssl_pool_histograms_("SSL2"), | |
| 274 ssl_socket_pool_(new SSLClientSocketPool( | |
| 275 g_max_sockets_per_pool, g_max_sockets_per_group, | |
| 276 &ssl_pool_histograms_, | |
| 277 host_resolver, | |
| 278 cert_verifier, | |
| 279 origin_bound_cert_service, | |
| 280 dnsrr_resolver, | |
| 281 dns_cert_checker, | |
| 282 ssl_host_info_factory, | |
| 283 socket_factory, | |
| 284 transport_socket_pool_.get(), | |
| 285 NULL /* no socks proxy */, | |
| 286 NULL /* no http proxy */, | |
| 287 ssl_config_service, | |
| 288 net_log)), | |
| 289 transport_for_socks_pool_histograms_("TCPforSOCKS"), | |
| 290 socks_pool_histograms_("SOCK"), | |
| 291 transport_for_http_proxy_pool_histograms_("TCPforHTTPProxy"), | |
| 292 transport_for_https_proxy_pool_histograms_("TCPforHTTPSProxy"), | |
| 293 ssl_for_https_proxy_pool_histograms_("SSLforHTTPSProxy"), | |
| 294 http_proxy_pool_histograms_("HTTPProxy"), | |
| 295 ssl_socket_pool_for_proxies_histograms_("SSLForProxies") { | |
| 296 CertDatabase::AddObserver(this); | |
| 297 } | |
| 298 | 226 |
| 299 ClientSocketPoolManager::~ClientSocketPoolManager() { | 227 // static |
| 300 CertDatabase::RemoveObserver(this); | 228 int ClientSocketPoolManager::max_sockets_per_pool() { |
| 301 } | 229 return g_max_sockets_per_pool; |
| 302 | |
| 303 void ClientSocketPoolManager::FlushSocketPools() { | |
| 304 // Flush the highest level pools first, since higher level pools may release | |
| 305 // stuff to the lower level pools. | |
| 306 | |
| 307 for (SSLSocketPoolMap::const_iterator it = | |
| 308 ssl_socket_pools_for_proxies_.begin(); | |
| 309 it != ssl_socket_pools_for_proxies_.end(); | |
| 310 ++it) | |
| 311 it->second->Flush(); | |
| 312 | |
| 313 for (HTTPProxySocketPoolMap::const_iterator it = | |
| 314 http_proxy_socket_pools_.begin(); | |
| 315 it != http_proxy_socket_pools_.end(); | |
| 316 ++it) | |
| 317 it->second->Flush(); | |
| 318 | |
| 319 for (SSLSocketPoolMap::const_iterator it = | |
| 320 ssl_socket_pools_for_https_proxies_.begin(); | |
| 321 it != ssl_socket_pools_for_https_proxies_.end(); | |
| 322 ++it) | |
| 323 it->second->Flush(); | |
| 324 | |
| 325 for (TransportSocketPoolMap::const_iterator it = | |
| 326 transport_socket_pools_for_https_proxies_.begin(); | |
| 327 it != transport_socket_pools_for_https_proxies_.end(); | |
| 328 ++it) | |
| 329 it->second->Flush(); | |
| 330 | |
| 331 for (TransportSocketPoolMap::const_iterator it = | |
| 332 transport_socket_pools_for_http_proxies_.begin(); | |
| 333 it != transport_socket_pools_for_http_proxies_.end(); | |
| 334 ++it) | |
| 335 it->second->Flush(); | |
| 336 | |
| 337 for (SOCKSSocketPoolMap::const_iterator it = | |
| 338 socks_socket_pools_.begin(); | |
| 339 it != socks_socket_pools_.end(); | |
| 340 ++it) | |
| 341 it->second->Flush(); | |
| 342 | |
| 343 for (TransportSocketPoolMap::const_iterator it = | |
| 344 transport_socket_pools_for_socks_proxies_.begin(); | |
| 345 it != transport_socket_pools_for_socks_proxies_.end(); | |
| 346 ++it) | |
| 347 it->second->Flush(); | |
| 348 | |
| 349 ssl_socket_pool_->Flush(); | |
| 350 transport_socket_pool_->Flush(); | |
| 351 } | |
| 352 | |
| 353 void ClientSocketPoolManager::CloseIdleSockets() { | |
| 354 // Close sockets in the highest level pools first, since higher level pools' | |
| 355 // sockets may release stuff to the lower level pools. | |
| 356 for (SSLSocketPoolMap::const_iterator it = | |
| 357 ssl_socket_pools_for_proxies_.begin(); | |
| 358 it != ssl_socket_pools_for_proxies_.end(); | |
| 359 ++it) | |
| 360 it->second->CloseIdleSockets(); | |
| 361 | |
| 362 for (HTTPProxySocketPoolMap::const_iterator it = | |
| 363 http_proxy_socket_pools_.begin(); | |
| 364 it != http_proxy_socket_pools_.end(); | |
| 365 ++it) | |
| 366 it->second->CloseIdleSockets(); | |
| 367 | |
| 368 for (SSLSocketPoolMap::const_iterator it = | |
| 369 ssl_socket_pools_for_https_proxies_.begin(); | |
| 370 it != ssl_socket_pools_for_https_proxies_.end(); | |
| 371 ++it) | |
| 372 it->second->CloseIdleSockets(); | |
| 373 | |
| 374 for (TransportSocketPoolMap::const_iterator it = | |
| 375 transport_socket_pools_for_https_proxies_.begin(); | |
| 376 it != transport_socket_pools_for_https_proxies_.end(); | |
| 377 ++it) | |
| 378 it->second->CloseIdleSockets(); | |
| 379 | |
| 380 for (TransportSocketPoolMap::const_iterator it = | |
| 381 transport_socket_pools_for_http_proxies_.begin(); | |
| 382 it != transport_socket_pools_for_http_proxies_.end(); | |
| 383 ++it) | |
| 384 it->second->CloseIdleSockets(); | |
| 385 | |
| 386 for (SOCKSSocketPoolMap::const_iterator it = | |
| 387 socks_socket_pools_.begin(); | |
| 388 it != socks_socket_pools_.end(); | |
| 389 ++it) | |
| 390 it->second->CloseIdleSockets(); | |
| 391 | |
| 392 for (TransportSocketPoolMap::const_iterator it = | |
| 393 transport_socket_pools_for_socks_proxies_.begin(); | |
| 394 it != transport_socket_pools_for_socks_proxies_.end(); | |
| 395 ++it) | |
| 396 it->second->CloseIdleSockets(); | |
| 397 | |
| 398 ssl_socket_pool_->CloseIdleSockets(); | |
| 399 transport_socket_pool_->CloseIdleSockets(); | |
| 400 } | |
| 401 | |
| 402 SOCKSClientSocketPool* ClientSocketPoolManager::GetSocketPoolForSOCKSProxy( | |
| 403 const HostPortPair& socks_proxy) { | |
| 404 SOCKSSocketPoolMap::const_iterator it = socks_socket_pools_.find(socks_proxy); | |
| 405 if (it != socks_socket_pools_.end()) { | |
| 406 DCHECK(ContainsKey(transport_socket_pools_for_socks_proxies_, socks_proxy)); | |
| 407 return it->second; | |
| 408 } | |
| 409 | |
| 410 DCHECK(!ContainsKey(transport_socket_pools_for_socks_proxies_, socks_proxy)); | |
| 411 | |
| 412 std::pair<TransportSocketPoolMap::iterator, bool> tcp_ret = | |
| 413 transport_socket_pools_for_socks_proxies_.insert( | |
| 414 std::make_pair( | |
| 415 socks_proxy, | |
| 416 new TransportClientSocketPool( | |
| 417 g_max_sockets_per_proxy_server, g_max_sockets_per_group, | |
| 418 &transport_for_socks_pool_histograms_, | |
| 419 host_resolver_, | |
| 420 socket_factory_, | |
| 421 net_log_))); | |
| 422 DCHECK(tcp_ret.second); | |
| 423 | |
| 424 std::pair<SOCKSSocketPoolMap::iterator, bool> ret = | |
| 425 socks_socket_pools_.insert( | |
| 426 std::make_pair(socks_proxy, new SOCKSClientSocketPool( | |
| 427 g_max_sockets_per_proxy_server, g_max_sockets_per_group, | |
| 428 &socks_pool_histograms_, | |
| 429 host_resolver_, | |
| 430 tcp_ret.first->second, | |
| 431 net_log_))); | |
| 432 | |
| 433 return ret.first->second; | |
| 434 } | |
| 435 | |
| 436 HttpProxyClientSocketPool* ClientSocketPoolManager::GetSocketPoolForHTTPProxy( | |
| 437 const HostPortPair& http_proxy) { | |
| 438 HTTPProxySocketPoolMap::const_iterator it = | |
| 439 http_proxy_socket_pools_.find(http_proxy); | |
| 440 if (it != http_proxy_socket_pools_.end()) { | |
| 441 DCHECK(ContainsKey(transport_socket_pools_for_http_proxies_, http_proxy)); | |
| 442 DCHECK(ContainsKey(transport_socket_pools_for_https_proxies_, http_proxy)); | |
| 443 DCHECK(ContainsKey(ssl_socket_pools_for_https_proxies_, http_proxy)); | |
| 444 return it->second; | |
| 445 } | |
| 446 | |
| 447 DCHECK(!ContainsKey(transport_socket_pools_for_http_proxies_, http_proxy)); | |
| 448 DCHECK(!ContainsKey(transport_socket_pools_for_https_proxies_, http_proxy)); | |
| 449 DCHECK(!ContainsKey(ssl_socket_pools_for_https_proxies_, http_proxy)); | |
| 450 | |
| 451 std::pair<TransportSocketPoolMap::iterator, bool> tcp_http_ret = | |
| 452 transport_socket_pools_for_http_proxies_.insert( | |
| 453 std::make_pair( | |
| 454 http_proxy, | |
| 455 new TransportClientSocketPool( | |
| 456 g_max_sockets_per_proxy_server, g_max_sockets_per_group, | |
| 457 &transport_for_http_proxy_pool_histograms_, | |
| 458 host_resolver_, | |
| 459 socket_factory_, | |
| 460 net_log_))); | |
| 461 DCHECK(tcp_http_ret.second); | |
| 462 | |
| 463 std::pair<TransportSocketPoolMap::iterator, bool> tcp_https_ret = | |
| 464 transport_socket_pools_for_https_proxies_.insert( | |
| 465 std::make_pair( | |
| 466 http_proxy, | |
| 467 new TransportClientSocketPool( | |
| 468 g_max_sockets_per_proxy_server, g_max_sockets_per_group, | |
| 469 &transport_for_https_proxy_pool_histograms_, | |
| 470 host_resolver_, | |
| 471 socket_factory_, | |
| 472 net_log_))); | |
| 473 DCHECK(tcp_https_ret.second); | |
| 474 | |
| 475 std::pair<SSLSocketPoolMap::iterator, bool> ssl_https_ret = | |
| 476 ssl_socket_pools_for_https_proxies_.insert( | |
| 477 std::make_pair( | |
| 478 http_proxy, | |
| 479 new SSLClientSocketPool( | |
| 480 g_max_sockets_per_proxy_server, g_max_sockets_per_group, | |
| 481 &ssl_for_https_proxy_pool_histograms_, | |
| 482 host_resolver_, | |
| 483 cert_verifier_, | |
| 484 origin_bound_cert_service_, | |
| 485 dnsrr_resolver_, | |
| 486 dns_cert_checker_, | |
| 487 ssl_host_info_factory_, | |
| 488 socket_factory_, | |
| 489 tcp_https_ret.first->second /* https proxy */, | |
| 490 NULL /* no socks proxy */, | |
| 491 NULL /* no http proxy */, | |
| 492 ssl_config_service_, net_log_))); | |
| 493 DCHECK(tcp_https_ret.second); | |
| 494 | |
| 495 std::pair<HTTPProxySocketPoolMap::iterator, bool> ret = | |
| 496 http_proxy_socket_pools_.insert( | |
| 497 std::make_pair( | |
| 498 http_proxy, | |
| 499 new HttpProxyClientSocketPool( | |
| 500 g_max_sockets_per_proxy_server, g_max_sockets_per_group, | |
| 501 &http_proxy_pool_histograms_, | |
| 502 host_resolver_, | |
| 503 tcp_http_ret.first->second, | |
| 504 ssl_https_ret.first->second, | |
| 505 net_log_))); | |
| 506 | |
| 507 return ret.first->second; | |
| 508 } | |
| 509 | |
| 510 SSLClientSocketPool* ClientSocketPoolManager::GetSocketPoolForSSLWithProxy( | |
| 511 const HostPortPair& proxy_server) { | |
| 512 SSLSocketPoolMap::const_iterator it = | |
| 513 ssl_socket_pools_for_proxies_.find(proxy_server); | |
| 514 if (it != ssl_socket_pools_for_proxies_.end()) | |
| 515 return it->second; | |
| 516 | |
| 517 SSLClientSocketPool* new_pool = new SSLClientSocketPool( | |
| 518 g_max_sockets_per_proxy_server, g_max_sockets_per_group, | |
| 519 &ssl_pool_histograms_, | |
| 520 host_resolver_, | |
| 521 cert_verifier_, | |
| 522 origin_bound_cert_service_, | |
| 523 dnsrr_resolver_, | |
| 524 dns_cert_checker_, | |
| 525 ssl_host_info_factory_, | |
| 526 socket_factory_, | |
| 527 NULL, /* no tcp pool, we always go through a proxy */ | |
| 528 GetSocketPoolForSOCKSProxy(proxy_server), | |
| 529 GetSocketPoolForHTTPProxy(proxy_server), | |
| 530 ssl_config_service_, | |
| 531 net_log_); | |
| 532 | |
| 533 std::pair<SSLSocketPoolMap::iterator, bool> ret = | |
| 534 ssl_socket_pools_for_proxies_.insert(std::make_pair(proxy_server, | |
| 535 new_pool)); | |
| 536 | |
| 537 return ret.first->second; | |
| 538 } | 230 } |
| 539 | 231 |
| 540 // static | 232 // static |
| 541 void ClientSocketPoolManager::set_max_sockets_per_pool(int socket_count) { | 233 void ClientSocketPoolManager::set_max_sockets_per_pool(int socket_count) { |
| 542 DCHECK_LT(0, socket_count); | 234 DCHECK_LT(0, socket_count); |
| 543 DCHECK_GT(1000, socket_count); // Sanity check. | 235 DCHECK_GT(1000, socket_count); // Sanity check. |
| 544 g_max_sockets_per_pool = socket_count; | 236 g_max_sockets_per_pool = socket_count; |
| 545 DCHECK_GE(g_max_sockets_per_pool, g_max_sockets_per_group); | 237 DCHECK_GE(g_max_sockets_per_pool, g_max_sockets_per_group); |
| 546 } | 238 } |
| 547 | 239 |
| 548 // static | 240 // static |
| 549 int ClientSocketPoolManager::max_sockets_per_group() { | 241 int ClientSocketPoolManager::max_sockets_per_group() { |
| 550 return g_max_sockets_per_group; | 242 return g_max_sockets_per_group; |
| 551 } | 243 } |
| 552 | 244 |
| 553 // static | 245 // static |
| 554 void ClientSocketPoolManager::set_max_sockets_per_group(int socket_count) { | 246 void ClientSocketPoolManager::set_max_sockets_per_group(int socket_count) { |
| 555 DCHECK_LT(0, socket_count); | 247 DCHECK_LT(0, socket_count); |
| 556 // The following is a sanity check... but we should NEVER be near this value. | 248 // The following is a sanity check... but we should NEVER be near this value. |
| 557 DCHECK_GT(100, socket_count); | 249 DCHECK_GT(100, socket_count); |
| 558 g_max_sockets_per_group = socket_count; | 250 g_max_sockets_per_group = socket_count; |
| 559 | 251 |
| 560 DCHECK_GE(g_max_sockets_per_pool, g_max_sockets_per_group); | 252 DCHECK_GE(g_max_sockets_per_pool, g_max_sockets_per_group); |
| 561 DCHECK_GE(g_max_sockets_per_proxy_server, g_max_sockets_per_group); | 253 DCHECK_GE(g_max_sockets_per_proxy_server, g_max_sockets_per_group); |
| 562 } | 254 } |
| 563 | 255 |
| 564 // static | 256 // static |
| 257 int ClientSocketPoolManager::max_sockets_per_proxy_server() { |
| 258 return g_max_sockets_per_proxy_server; |
| 259 } |
| 260 |
| 261 // static |
| 565 void ClientSocketPoolManager::set_max_sockets_per_proxy_server( | 262 void ClientSocketPoolManager::set_max_sockets_per_proxy_server( |
| 566 int socket_count) { | 263 int socket_count) { |
| 567 DCHECK_LT(0, socket_count); | 264 DCHECK_LT(0, socket_count); |
| 568 DCHECK_GT(100, socket_count); // Sanity check. | 265 DCHECK_GT(100, socket_count); // Sanity check. |
| 569 // Assert this case early on. The max number of sockets per group cannot | 266 // Assert this case early on. The max number of sockets per group cannot |
| 570 // exceed the max number of sockets per proxy server. | 267 // exceed the max number of sockets per proxy server. |
| 571 DCHECK_LE(g_max_sockets_per_group, socket_count); | 268 DCHECK_LE(g_max_sockets_per_group, socket_count); |
| 572 g_max_sockets_per_proxy_server = socket_count; | 269 g_max_sockets_per_proxy_server = socket_count; |
| 573 } | 270 } |
| 574 | 271 |
| 575 Value* ClientSocketPoolManager::SocketPoolInfoToValue() const { | 272 int InitSocketHandleForHttpRequest( |
| 576 ListValue* list = new ListValue(); | |
| 577 list->Append(transport_socket_pool_->GetInfoAsValue("transport_socket_pool", | |
| 578 "transport_socket_pool", | |
| 579 false)); | |
| 580 // Third parameter is false because |ssl_socket_pool_| uses | |
| 581 // |transport_socket_pool_| internally, and do not want to add it a second | |
| 582 // time. | |
| 583 list->Append(ssl_socket_pool_->GetInfoAsValue("ssl_socket_pool", | |
| 584 "ssl_socket_pool", | |
| 585 false)); | |
| 586 AddSocketPoolsToList(list, | |
| 587 http_proxy_socket_pools_, | |
| 588 "http_proxy_socket_pool", | |
| 589 true); | |
| 590 AddSocketPoolsToList(list, | |
| 591 socks_socket_pools_, | |
| 592 "socks_socket_pool", | |
| 593 true); | |
| 594 | |
| 595 // Third parameter is false because |ssl_socket_pools_for_proxies_| use | |
| 596 // socket pools in |http_proxy_socket_pools_| and |socks_socket_pools_|. | |
| 597 AddSocketPoolsToList(list, | |
| 598 ssl_socket_pools_for_proxies_, | |
| 599 "ssl_socket_pool_for_proxies", | |
| 600 false); | |
| 601 return list; | |
| 602 } | |
| 603 | |
| 604 void ClientSocketPoolManager::OnUserCertAdded(const X509Certificate* cert) { | |
| 605 FlushSocketPools(); | |
| 606 } | |
| 607 | |
| 608 void ClientSocketPoolManager::OnCertTrustChanged(const X509Certificate* cert) { | |
| 609 // We should flush the socket pools if we removed trust from a | |
| 610 // cert, because a previously trusted server may have become | |
| 611 // untrusted. | |
| 612 // | |
| 613 // We should not flush the socket pools if we added trust to a | |
| 614 // cert. | |
| 615 // | |
| 616 // Since the OnCertTrustChanged method doesn't tell us what | |
| 617 // kind of trust change it is, we have to flush the socket | |
| 618 // pools to be safe. | |
| 619 FlushSocketPools(); | |
| 620 } | |
| 621 | |
| 622 // static | |
| 623 int ClientSocketPoolManager::InitSocketHandleForHttpRequest( | |
| 624 const GURL& request_url, | 273 const GURL& request_url, |
| 625 const HttpRequestHeaders& request_extra_headers, | 274 const HttpRequestHeaders& request_extra_headers, |
| 626 int request_load_flags, | 275 int request_load_flags, |
| 627 RequestPriority request_priority, | 276 RequestPriority request_priority, |
| 628 HttpNetworkSession* session, | 277 HttpNetworkSession* session, |
| 629 const ProxyInfo& proxy_info, | 278 const ProxyInfo& proxy_info, |
| 630 bool force_spdy_over_ssl, | 279 bool force_spdy_over_ssl, |
| 631 bool want_spdy_over_npn, | 280 bool want_spdy_over_npn, |
| 632 const SSLConfig& ssl_config_for_origin, | 281 const SSLConfig& ssl_config_for_origin, |
| 633 const SSLConfig& ssl_config_for_proxy, | 282 const SSLConfig& ssl_config_for_proxy, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 645 want_spdy_over_npn, | 294 want_spdy_over_npn, |
| 646 ssl_config_for_origin, | 295 ssl_config_for_origin, |
| 647 ssl_config_for_proxy, | 296 ssl_config_for_proxy, |
| 648 false, | 297 false, |
| 649 net_log, | 298 net_log, |
| 650 0, | 299 0, |
| 651 socket_handle, | 300 socket_handle, |
| 652 callback); | 301 callback); |
| 653 } | 302 } |
| 654 | 303 |
| 655 // static | 304 int InitSocketHandleForRawConnect( |
| 656 int ClientSocketPoolManager::InitSocketHandleForRawConnect( | |
| 657 const HostPortPair& host_port_pair, | 305 const HostPortPair& host_port_pair, |
| 658 HttpNetworkSession* session, | 306 HttpNetworkSession* session, |
| 659 const ProxyInfo& proxy_info, | 307 const ProxyInfo& proxy_info, |
| 660 const SSLConfig& ssl_config_for_origin, | 308 const SSLConfig& ssl_config_for_origin, |
| 661 const SSLConfig& ssl_config_for_proxy, | 309 const SSLConfig& ssl_config_for_proxy, |
| 662 const BoundNetLog& net_log, | 310 const BoundNetLog& net_log, |
| 663 ClientSocketHandle* socket_handle, | 311 ClientSocketHandle* socket_handle, |
| 664 OldCompletionCallback* callback) { | 312 OldCompletionCallback* callback) { |
| 665 DCHECK(socket_handle); | 313 DCHECK(socket_handle); |
| 666 // Synthesize an HttpRequestInfo. | 314 // Synthesize an HttpRequestInfo. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 679 false, | 327 false, |
| 680 ssl_config_for_origin, | 328 ssl_config_for_origin, |
| 681 ssl_config_for_proxy, | 329 ssl_config_for_proxy, |
| 682 true, | 330 true, |
| 683 net_log, | 331 net_log, |
| 684 0, | 332 0, |
| 685 socket_handle, | 333 socket_handle, |
| 686 callback); | 334 callback); |
| 687 } | 335 } |
| 688 | 336 |
| 689 // static | 337 int PreconnectSocketsForHttpRequest( |
| 690 int ClientSocketPoolManager::PreconnectSocketsForHttpRequest( | |
| 691 const GURL& request_url, | 338 const GURL& request_url, |
| 692 const HttpRequestHeaders& request_extra_headers, | 339 const HttpRequestHeaders& request_extra_headers, |
| 693 int request_load_flags, | 340 int request_load_flags, |
| 694 RequestPriority request_priority, | 341 RequestPriority request_priority, |
| 695 HttpNetworkSession* session, | 342 HttpNetworkSession* session, |
| 696 const ProxyInfo& proxy_info, | 343 const ProxyInfo& proxy_info, |
| 697 bool force_spdy_over_ssl, | 344 bool force_spdy_over_ssl, |
| 698 bool want_spdy_over_npn, | 345 bool want_spdy_over_npn, |
| 699 const SSLConfig& ssl_config_for_origin, | 346 const SSLConfig& ssl_config_for_origin, |
| 700 const SSLConfig& ssl_config_for_proxy, | 347 const SSLConfig& ssl_config_for_proxy, |
| 701 const BoundNetLog& net_log, | 348 const BoundNetLog& net_log, |
| 702 int num_preconnect_streams) { | 349 int num_preconnect_streams) { |
| 703 return InitSocketPoolHelper(request_url, | 350 return InitSocketPoolHelper(request_url, |
| 704 request_extra_headers, | 351 request_extra_headers, |
| 705 request_load_flags, | 352 request_load_flags, |
| 706 request_priority, | 353 request_priority, |
| 707 session, | 354 session, |
| 708 proxy_info, | 355 proxy_info, |
| 709 force_spdy_over_ssl, | 356 force_spdy_over_ssl, |
| 710 want_spdy_over_npn, | 357 want_spdy_over_npn, |
| 711 ssl_config_for_origin, | 358 ssl_config_for_origin, |
| 712 ssl_config_for_proxy, | 359 ssl_config_for_proxy, |
| 713 false, | 360 false, |
| 714 net_log, | 361 net_log, |
| 715 num_preconnect_streams, | 362 num_preconnect_streams, |
| 716 NULL, | 363 NULL, |
| 717 NULL); | 364 NULL); |
| 718 } | 365 } |
| 719 | 366 |
| 720 | |
| 721 } // namespace net | 367 } // namespace net |
| OLD | NEW |