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 |