Chromium Code Reviews| 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.h" | 5 #include "net/socket/client_socket_pool_manager.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 57 // http://crbug.com/44501 for details about proxy server connection limits. | 57 // http://crbug.com/44501 for details about proxy server connection limits. |
| 58 int g_max_sockets_per_proxy_server[] = { | 58 int g_max_sockets_per_proxy_server[] = { |
| 59 kDefaultMaxSocketsPerProxyServer, // NORMAL_SOCKET_POOL | 59 kDefaultMaxSocketsPerProxyServer, // NORMAL_SOCKET_POOL |
| 60 kDefaultMaxSocketsPerProxyServer // WEBSOCKET_SOCKET_POOL | 60 kDefaultMaxSocketsPerProxyServer // WEBSOCKET_SOCKET_POOL |
| 61 }; | 61 }; |
| 62 | 62 |
| 63 COMPILE_ASSERT(arraysize(g_max_sockets_per_proxy_server) == | 63 COMPILE_ASSERT(arraysize(g_max_sockets_per_proxy_server) == |
| 64 HttpNetworkSession::NUM_SOCKET_POOL_TYPES, | 64 HttpNetworkSession::NUM_SOCKET_POOL_TYPES, |
| 65 max_sockets_per_proxy_server_length_mismatch); | 65 max_sockets_per_proxy_server_length_mismatch); |
| 66 | 66 |
| 67 int PretendToRequestSocketsForPool(ClientSocketPool* pool, | |
| 68 const std::string& group_name, | |
| 69 int num_sockets) { | |
| 70 int idle_count = pool->IdleSocketCountInGroup(group_name); | |
| 71 | |
| 72 int would_have_been_connected = num_sockets - idle_count; | |
|
mmenke
2013/05/01 16:55:08
This count isn't correct. We actually use NumActi
| |
| 73 if (would_have_been_connected > 0) | |
| 74 would_have_been_connected = 0; | |
| 75 return would_have_been_connected; | |
| 76 } | |
| 77 | |
| 67 // The meat of the implementation for the InitSocketHandleForHttpRequest, | 78 // The meat of the implementation for the InitSocketHandleForHttpRequest, |
| 68 // InitSocketHandleForRawConnect and PreconnectSocketsForHttpRequest methods. | 79 // InitSocketHandleForRawConnect and PreconnectSocketsForHttpRequest methods. |
| 69 int InitSocketPoolHelper(const GURL& request_url, | 80 int InitSocketPoolHelper(const GURL& request_url, |
| 70 const HttpRequestHeaders& request_extra_headers, | 81 const HttpRequestHeaders& request_extra_headers, |
| 71 int request_load_flags, | 82 int request_load_flags, |
| 72 RequestPriority request_priority, | 83 RequestPriority request_priority, |
| 73 HttpNetworkSession* session, | 84 HttpNetworkSession* session, |
| 74 const ProxyInfo& proxy_info, | 85 const ProxyInfo& proxy_info, |
| 75 bool force_spdy_over_ssl, | 86 bool force_spdy_over_ssl, |
| 76 bool want_spdy_over_npn, | 87 bool want_spdy_over_npn, |
| 77 const SSLConfig& ssl_config_for_origin, | 88 const SSLConfig& ssl_config_for_origin, |
| 78 const SSLConfig& ssl_config_for_proxy, | 89 const SSLConfig& ssl_config_for_proxy, |
| 79 bool force_tunnel, | 90 bool force_tunnel, |
| 80 const BoundNetLog& net_log, | 91 const BoundNetLog& net_log, |
| 81 int num_preconnect_streams, | 92 int num_preconnect_streams, |
| 93 bool pretend_to_preconnect, | |
| 82 ClientSocketHandle* socket_handle, | 94 ClientSocketHandle* socket_handle, |
| 83 const OnHostResolutionCallback& resolution_callback, | 95 const OnHostResolutionCallback& resolution_callback, |
| 84 const CompletionCallback& callback) { | 96 const CompletionCallback& callback) { |
| 85 scoped_refptr<TransportSocketParams> tcp_params; | 97 scoped_refptr<TransportSocketParams> tcp_params; |
| 86 scoped_refptr<HttpProxySocketParams> http_proxy_params; | 98 scoped_refptr<HttpProxySocketParams> http_proxy_params; |
| 87 scoped_refptr<SOCKSSocketParams> socks_params; | 99 scoped_refptr<SOCKSSocketParams> socks_params; |
| 88 scoped_ptr<HostPortPair> proxy_host_port; | 100 scoped_ptr<HostPortPair> proxy_host_port; |
| 89 | 101 |
| 90 bool using_ssl = request_url.SchemeIs("https") || force_spdy_over_ssl; | 102 bool using_ssl = request_url.SchemeIs("https") || force_spdy_over_ssl; |
| 91 | 103 |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 231 if (proxy_info.is_direct()) { | 243 if (proxy_info.is_direct()) { |
| 232 ssl_pool = session->GetSSLSocketPool( | 244 ssl_pool = session->GetSSLSocketPool( |
| 233 HttpNetworkSession::NORMAL_SOCKET_POOL); | 245 HttpNetworkSession::NORMAL_SOCKET_POOL); |
| 234 } else { | 246 } else { |
| 235 ssl_pool = session->GetSocketPoolForSSLWithProxy( | 247 ssl_pool = session->GetSocketPoolForSSLWithProxy( |
| 236 HttpNetworkSession::NORMAL_SOCKET_POOL, | 248 HttpNetworkSession::NORMAL_SOCKET_POOL, |
| 237 *proxy_host_port); | 249 *proxy_host_port); |
| 238 } | 250 } |
| 239 | 251 |
| 240 if (num_preconnect_streams) { | 252 if (num_preconnect_streams) { |
| 253 if (pretend_to_preconnect) | |
| 254 return PretendToRequestSocketsForPool( | |
| 255 ssl_pool, connection_group, num_preconnect_streams); | |
| 256 | |
| 241 RequestSocketsForPool(ssl_pool, connection_group, ssl_params, | 257 RequestSocketsForPool(ssl_pool, connection_group, ssl_params, |
| 242 num_preconnect_streams, net_log); | 258 num_preconnect_streams, net_log); |
| 259 | |
| 243 return OK; | 260 return OK; |
| 244 } | 261 } |
| 245 | 262 |
| 246 return socket_handle->Init(connection_group, ssl_params, | 263 return socket_handle->Init(connection_group, ssl_params, |
| 247 request_priority, callback, ssl_pool, | 264 request_priority, callback, ssl_pool, |
| 248 net_log); | 265 net_log); |
| 249 } | 266 } |
| 250 | 267 |
| 251 // Finally, get the connection started. | 268 // Finally, get the connection started. |
| 252 | 269 |
| 253 if (proxy_info.is_http() || proxy_info.is_https()) { | 270 if (proxy_info.is_http() || proxy_info.is_https()) { |
| 254 HttpProxyClientSocketPool* pool = | 271 HttpProxyClientSocketPool* pool = |
| 255 session->GetSocketPoolForHTTPProxy( | 272 session->GetSocketPoolForHTTPProxy( |
| 256 HttpNetworkSession::NORMAL_SOCKET_POOL, | 273 HttpNetworkSession::NORMAL_SOCKET_POOL, |
| 257 *proxy_host_port); | 274 *proxy_host_port); |
| 258 if (num_preconnect_streams) { | 275 if (num_preconnect_streams) { |
| 276 if (pretend_to_preconnect) | |
| 277 return PretendToRequestSocketsForPool( | |
| 278 pool, connection_group, num_preconnect_streams); | |
| 279 | |
| 259 RequestSocketsForPool(pool, connection_group, http_proxy_params, | 280 RequestSocketsForPool(pool, connection_group, http_proxy_params, |
| 260 num_preconnect_streams, net_log); | 281 num_preconnect_streams, net_log); |
| 261 return OK; | 282 return OK; |
| 262 } | 283 } |
| 263 | 284 |
| 264 return socket_handle->Init(connection_group, http_proxy_params, | 285 return socket_handle->Init(connection_group, http_proxy_params, |
| 265 request_priority, callback, | 286 request_priority, callback, |
| 266 pool, net_log); | 287 pool, net_log); |
| 267 } | 288 } |
| 268 | 289 |
| 269 if (proxy_info.is_socks()) { | 290 if (proxy_info.is_socks()) { |
| 270 SOCKSClientSocketPool* pool = | 291 SOCKSClientSocketPool* pool = |
| 271 session->GetSocketPoolForSOCKSProxy( | 292 session->GetSocketPoolForSOCKSProxy( |
| 272 HttpNetworkSession::NORMAL_SOCKET_POOL, | 293 HttpNetworkSession::NORMAL_SOCKET_POOL, |
| 273 *proxy_host_port); | 294 *proxy_host_port); |
| 274 if (num_preconnect_streams) { | 295 if (num_preconnect_streams) { |
| 296 if (pretend_to_preconnect) | |
| 297 return PretendToRequestSocketsForPool( | |
| 298 pool, connection_group, num_preconnect_streams); | |
| 299 | |
| 275 RequestSocketsForPool(pool, connection_group, socks_params, | 300 RequestSocketsForPool(pool, connection_group, socks_params, |
| 276 num_preconnect_streams, net_log); | 301 num_preconnect_streams, net_log); |
| 277 return OK; | 302 return OK; |
| 278 } | 303 } |
| 279 | 304 |
| 280 return socket_handle->Init(connection_group, socks_params, | 305 return socket_handle->Init(connection_group, socks_params, |
| 281 request_priority, callback, pool, | 306 request_priority, callback, pool, |
| 282 net_log); | 307 net_log); |
| 283 } | 308 } |
| 284 | 309 |
| 285 DCHECK(proxy_info.is_direct()); | 310 DCHECK(proxy_info.is_direct()); |
| 286 | 311 |
| 287 TransportClientSocketPool* pool = | 312 TransportClientSocketPool* pool = |
| 288 session->GetTransportSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL); | 313 session->GetTransportSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL); |
| 289 if (num_preconnect_streams) { | 314 if (num_preconnect_streams) { |
| 315 if (pretend_to_preconnect) | |
| 316 return PretendToRequestSocketsForPool( | |
| 317 pool, connection_group, num_preconnect_streams); | |
| 318 | |
| 290 RequestSocketsForPool(pool, connection_group, tcp_params, | 319 RequestSocketsForPool(pool, connection_group, tcp_params, |
| 291 num_preconnect_streams, net_log); | 320 num_preconnect_streams, net_log); |
| 292 return OK; | 321 return OK; |
| 293 } | 322 } |
| 294 | 323 |
| 295 return socket_handle->Init(connection_group, tcp_params, | 324 return socket_handle->Init(connection_group, tcp_params, |
| 296 request_priority, callback, | 325 request_priority, callback, |
| 297 pool, net_log); | 326 pool, net_log); |
| 298 } | 327 } |
| 299 | 328 |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 376 const SSLConfig& ssl_config_for_origin, | 405 const SSLConfig& ssl_config_for_origin, |
| 377 const SSLConfig& ssl_config_for_proxy, | 406 const SSLConfig& ssl_config_for_proxy, |
| 378 const BoundNetLog& net_log, | 407 const BoundNetLog& net_log, |
| 379 ClientSocketHandle* socket_handle, | 408 ClientSocketHandle* socket_handle, |
| 380 const OnHostResolutionCallback& resolution_callback, | 409 const OnHostResolutionCallback& resolution_callback, |
| 381 const CompletionCallback& callback) { | 410 const CompletionCallback& callback) { |
| 382 DCHECK(socket_handle); | 411 DCHECK(socket_handle); |
| 383 return InitSocketPoolHelper( | 412 return InitSocketPoolHelper( |
| 384 request_url, request_extra_headers, request_load_flags, request_priority, | 413 request_url, request_extra_headers, request_load_flags, request_priority, |
| 385 session, proxy_info, force_spdy_over_ssl, want_spdy_over_npn, | 414 session, proxy_info, force_spdy_over_ssl, want_spdy_over_npn, |
| 386 ssl_config_for_origin, ssl_config_for_proxy, false, net_log, 0, | 415 ssl_config_for_origin, ssl_config_for_proxy, false, net_log, 0, true, |
| 387 socket_handle, resolution_callback, callback); | 416 socket_handle, resolution_callback, callback); |
| 388 } | 417 } |
| 389 | 418 |
| 390 int InitSocketHandleForRawConnect( | 419 int InitSocketHandleForRawConnect( |
| 391 const HostPortPair& host_port_pair, | 420 const HostPortPair& host_port_pair, |
| 392 HttpNetworkSession* session, | 421 HttpNetworkSession* session, |
| 393 const ProxyInfo& proxy_info, | 422 const ProxyInfo& proxy_info, |
| 394 const SSLConfig& ssl_config_for_origin, | 423 const SSLConfig& ssl_config_for_origin, |
| 395 const SSLConfig& ssl_config_for_proxy, | 424 const SSLConfig& ssl_config_for_proxy, |
| 396 const BoundNetLog& net_log, | 425 const BoundNetLog& net_log, |
| 397 ClientSocketHandle* socket_handle, | 426 ClientSocketHandle* socket_handle, |
| 398 const CompletionCallback& callback) { | 427 const CompletionCallback& callback) { |
| 399 DCHECK(socket_handle); | 428 DCHECK(socket_handle); |
| 400 // Synthesize an HttpRequestInfo. | 429 // Synthesize an HttpRequestInfo. |
| 401 GURL request_url = GURL("http://" + host_port_pair.ToString()); | 430 GURL request_url = GURL("http://" + host_port_pair.ToString()); |
| 402 HttpRequestHeaders request_extra_headers; | 431 HttpRequestHeaders request_extra_headers; |
| 403 int request_load_flags = 0; | 432 int request_load_flags = 0; |
| 404 RequestPriority request_priority = MEDIUM; | 433 RequestPriority request_priority = MEDIUM; |
| 405 | 434 |
| 406 return InitSocketPoolHelper( | 435 return InitSocketPoolHelper( |
| 407 request_url, request_extra_headers, request_load_flags, request_priority, | 436 request_url, request_extra_headers, request_load_flags, request_priority, |
| 408 session, proxy_info, false, false, ssl_config_for_origin, | 437 session, proxy_info, false, false, ssl_config_for_origin, |
| 409 ssl_config_for_proxy, true, net_log, 0, socket_handle, | 438 ssl_config_for_proxy, true, net_log, 0, true, socket_handle, |
| 410 OnHostResolutionCallback(), callback); | 439 OnHostResolutionCallback(), callback); |
| 411 } | 440 } |
| 412 | 441 |
| 413 int PreconnectSocketsForHttpRequest( | 442 int PreconnectSocketsForHttpRequest( |
| 414 const GURL& request_url, | 443 const GURL& request_url, |
| 415 const HttpRequestHeaders& request_extra_headers, | 444 const HttpRequestHeaders& request_extra_headers, |
| 416 int request_load_flags, | 445 int request_load_flags, |
| 417 RequestPriority request_priority, | 446 RequestPriority request_priority, |
| 418 HttpNetworkSession* session, | 447 HttpNetworkSession* session, |
| 419 const ProxyInfo& proxy_info, | 448 const ProxyInfo& proxy_info, |
| 420 bool force_spdy_over_ssl, | 449 bool force_spdy_over_ssl, |
| 421 bool want_spdy_over_npn, | 450 bool want_spdy_over_npn, |
| 422 const SSLConfig& ssl_config_for_origin, | 451 const SSLConfig& ssl_config_for_origin, |
| 423 const SSLConfig& ssl_config_for_proxy, | 452 const SSLConfig& ssl_config_for_proxy, |
| 424 const BoundNetLog& net_log, | 453 const BoundNetLog& net_log, |
| 425 int num_preconnect_streams) { | 454 int num_preconnect_streams) { |
| 426 return InitSocketPoolHelper( | 455 return InitSocketPoolHelper( |
| 427 request_url, request_extra_headers, request_load_flags, request_priority, | 456 request_url, request_extra_headers, request_load_flags, request_priority, |
| 428 session, proxy_info, force_spdy_over_ssl, want_spdy_over_npn, | 457 session, proxy_info, force_spdy_over_ssl, want_spdy_over_npn, |
| 429 ssl_config_for_origin, ssl_config_for_proxy, false, net_log, | 458 ssl_config_for_origin, ssl_config_for_proxy, false, net_log, |
| 430 num_preconnect_streams, NULL, OnHostResolutionCallback(), | 459 num_preconnect_streams, true, NULL, OnHostResolutionCallback(), |
| 431 CompletionCallback()); | 460 CompletionCallback()); |
| 432 } | 461 } |
| 433 | 462 |
| 463 int PretendToPreconnectSocketsForHttpRequest( | |
| 464 const GURL& request_url, | |
| 465 const HttpRequestHeaders& request_extra_headers, | |
| 466 int request_load_flags, | |
| 467 RequestPriority request_priority, | |
| 468 HttpNetworkSession* session, | |
| 469 const ProxyInfo& proxy_info, | |
| 470 bool force_spdy_over_ssl, | |
| 471 bool want_spdy_over_npn, | |
| 472 const SSLConfig& ssl_config_for_origin, | |
| 473 const SSLConfig& ssl_config_for_proxy, | |
| 474 const BoundNetLog& net_log, | |
| 475 int num_preconnect_streams) { | |
| 476 return InitSocketPoolHelper( | |
| 477 request_url, request_extra_headers, request_load_flags, request_priority, | |
| 478 session, proxy_info, force_spdy_over_ssl, want_spdy_over_npn, | |
| 479 ssl_config_for_origin, ssl_config_for_proxy, false, net_log, | |
| 480 num_preconnect_streams, false, NULL, OnHostResolutionCallback(), | |
| 481 CompletionCallback()); | |
| 482 } | |
| 483 | |
| 434 } // namespace net | 484 } // namespace net |
| OLD | NEW |