15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/client_socket_pool_manager.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 115e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/load_flags.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_proxy_client_socket_pool.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_request_info.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_stream_factory.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_info.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/client_socket_handle.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/socks_client_socket_pool.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/ssl_client_socket_pool.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/transport_client_socket_pool.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Limit of sockets of each socket pool. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int g_max_sockets_per_pool[] = { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 256, // NORMAL_SOCKET_POOL 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 256 // WEBSOCKET_SOCKET_POOL 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(arraysize(g_max_sockets_per_pool) == 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpNetworkSession::NUM_SOCKET_POOL_TYPES, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_sockets_per_pool_length_mismatch); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Default to allow up to 6 connections per host. Experiment and tuning may 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// try other values (greater than 0). Too large may cause many problems, such 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as home routers blocking the connections!?!? See http://crbug.com/12066. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebSocket connections are long-lived, and should be treated differently 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// than normal other connections. 6 connections per group sounded too small 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for such use, thus we use a larger limit which was determined somewhat 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// arbitrarily. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(yutak): Look at the usage and determine the right value after 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebSocket protocol stack starts to work. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int g_max_sockets_per_group[] = { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6, // NORMAL_SOCKET_POOL 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30 // WEBSOCKET_SOCKET_POOL 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(arraysize(g_max_sockets_per_group) == 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpNetworkSession::NUM_SOCKET_POOL_TYPES, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_sockets_per_group_length_mismatch); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The max number of sockets to allow per proxy server. This applies both to 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http and SOCKS proxies. See http://crbug.com/12066 and 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/44501 for details about proxy server connection limits. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int g_max_sockets_per_proxy_server[] = { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDefaultMaxSocketsPerProxyServer, // NORMAL_SOCKET_POOL 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDefaultMaxSocketsPerProxyServer // WEBSOCKET_SOCKET_POOL 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(arraysize(g_max_sockets_per_proxy_server) == 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpNetworkSession::NUM_SOCKET_POOL_TYPES, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_sockets_per_proxy_server_length_mismatch); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The meat of the implementation for the InitSocketHandleForHttpRequest, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// InitSocketHandleForRawConnect and PreconnectSocketsForHttpRequest methods. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int InitSocketPoolHelper(const GURL& request_url, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpRequestHeaders& request_extra_headers, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_load_flags, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestPriority request_priority, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpNetworkSession* session, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ProxyInfo& proxy_info, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool force_spdy_over_ssl, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool want_spdy_over_npn, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SSLConfig& ssl_config_for_origin, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SSLConfig& ssl_config_for_proxy, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool force_tunnel, 8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PrivacyMode privacy_mode, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BoundNetLog& net_log, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_preconnect_streams, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientSocketHandle* socket_handle, 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HttpNetworkSession::SocketPoolType socket_pool_type, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const OnHostResolutionCallback& resolution_callback, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback) { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<HttpProxySocketParams> http_proxy_params; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<SOCKSSocketParams> socks_params; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HostPortPair> proxy_host_port; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool using_ssl = request_url.SchemeIs("https") || 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch request_url.SchemeIs("wss") || force_spdy_over_ssl; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostPortPair origin_host_port = 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostPortPair(request_url.HostNoBrackets(), 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_url.EffectiveIntPort()); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!using_ssl && session->params().testing_fixed_http_port != 0) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin_host_port.set_port(session->params().testing_fixed_http_port); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (using_ssl && session->params().testing_fixed_https_port != 0) { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin_host_port.set_port(session->params().testing_fixed_https_port); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool disable_resolver_cache = 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_load_flags & LOAD_BYPASS_CACHE || 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_load_flags & LOAD_VALIDATE_CACHE || 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_load_flags & LOAD_DISABLE_CACHE; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int load_flags = request_load_flags; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (session->params().ignore_certificate_errors) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_flags |= LOAD_IGNORE_ALL_CERT_ERRORS; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Build the string used to uniquely identify connections of this type. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Determine the host and port to connect to. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string connection_group = origin_host_port.ToString(); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!connection_group.empty()); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (request_url.SchemeIs("ftp")) { 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Combining FTP with forced SPDY over SSL would be a "path to madness". 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure we never do that. 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!using_ssl); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) connection_group = "ftp/" + connection_group; 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (using_ssl) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All connections in a group should use the same SSLConfig settings. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Encode version_max in the connection group's name, unless it's the 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // default version_max. (We want the common case to use the shortest 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // encoding). A version_max of TLS 1.1 is encoded as "ssl(max:3.2)/" 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rather than "tlsv1.1/" because the actual protocol version, which 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is selected by the server, may not be TLS 1.1. Do not encode 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // version_min in the connection group's name because version_min 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should be the same for all connections, whereas version_max may 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // change for version fallbacks. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string prefix = "ssl/"; 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (ssl_config_for_origin.version_max != kDefaultSSLVersionMax) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (ssl_config_for_origin.version_max) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SSL_PROTOCOL_VERSION_TLS1_2: 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefix = "ssl(max:3.3)/"; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SSL_PROTOCOL_VERSION_TLS1_1: 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefix = "ssl(max:3.2)/"; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SSL_PROTOCOL_VERSION_TLS1: 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefix = "ssl(max:3.1)/"; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SSL_PROTOCOL_VERSION_SSL3: 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefix = "sslv3/"; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(false); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) connection_group = prefix + connection_group; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ignore_limits = (request_load_flags & LOAD_IGNORE_LIMITS) != 0; 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!proxy_info.is_direct()) { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyServer proxy_server = proxy_info.proxy_server(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy_host_port.reset(new HostPortPair(proxy_server.host_port_pair())); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<TransportSocketParams> proxy_tcp_params( 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new TransportSocketParams( 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *proxy_host_port, 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci disable_resolver_cache, 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ignore_limits, 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci resolution_callback, 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (proxy_info.is_http() || proxy_info.is_https()) { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string user_agent; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_extra_headers.GetHeader(HttpRequestHeaders::kUserAgent, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &user_agent); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<SSLSocketParams> ssl_params; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (proxy_info.is_https()) { 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Combine connect and write for SSL sockets in TCP FastOpen 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // field trial. 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TransportSocketParams::CombineConnectAndWritePolicy 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci combine_connect_and_write = 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci session->params().enable_tcp_fast_open_for_ssl ? 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DESIRED : 1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT; 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci proxy_tcp_params = new TransportSocketParams(*proxy_host_port, 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci disable_resolver_cache, 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ignore_limits, 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci resolution_callback, 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci combine_connect_and_write); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set ssl_params, and unset proxy_tcp_params 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_params = new SSLSocketParams(proxy_tcp_params, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *proxy_host_port.get(), 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_config_for_proxy, 192e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch PRIVACY_MODE_DISABLED, 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_flags, 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) force_spdy_over_ssl, 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) want_spdy_over_npn); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy_tcp_params = NULL; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_proxy_params = 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new HttpProxySocketParams(proxy_tcp_params, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_params, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_url, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_agent, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin_host_port, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session->http_auth_cache(), 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session->http_auth_handler_factory(), 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session->spdy_session_pool(), 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci force_tunnel || using_ssl, 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci session->params().proxy_delegate); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(proxy_info.is_socks()); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char socks_version; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (proxy_server.scheme() == ProxyServer::SCHEME_SOCKS5) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socks_version = '5'; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socks_version = '4'; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) connection_group = base::StringPrintf( 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "socks%c/%s", socks_version, connection_group.c_str()); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socks_params = new SOCKSSocketParams(proxy_tcp_params, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socks_version == '5', 2223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) origin_host_port); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Change group name if privacy mode is enabled. 227e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (privacy_mode == PRIVACY_MODE_ENABLED) 2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch connection_group = "pm/" + connection_group; 2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deal with SSL - which layers on top of any given proxy. 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (using_ssl) { 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<TransportSocketParams> ssl_tcp_params; 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (proxy_info.is_direct()) { 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Setup TCP params if non-proxied SSL connection. 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Combine connect and write for SSL sockets in TCP FastOpen field trial. 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TransportSocketParams::CombineConnectAndWritePolicy 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci combine_connect_and_write = 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci session->params().enable_tcp_fast_open_for_ssl ? 2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DESIRED : 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT; 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ssl_tcp_params = new TransportSocketParams(origin_host_port, 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci disable_resolver_cache, 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ignore_limits, 2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci resolution_callback, 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci combine_connect_and_write); 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<SSLSocketParams> ssl_params = 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new SSLSocketParams(ssl_tcp_params, 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socks_params, 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_proxy_params, 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin_host_port, 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_config_for_origin, 2537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch privacy_mode, 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_flags, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) force_spdy_over_ssl, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) want_spdy_over_npn); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLClientSocketPool* ssl_pool = NULL; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (proxy_info.is_direct()) { 259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ssl_pool = session->GetSSLSocketPool(socket_pool_type); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ssl_pool = session->GetSocketPoolForSSLWithProxy(socket_pool_type, 262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *proxy_host_port); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (num_preconnect_streams) { 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestSocketsForPool(ssl_pool, connection_group, ssl_params, 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_preconnect_streams, net_log); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return socket_handle->Init(connection_group, ssl_params, 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_priority, callback, ssl_pool, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net_log); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finally, get the connection started. 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (proxy_info.is_http() || proxy_info.is_https()) { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpProxyClientSocketPool* pool = 280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch session->GetSocketPoolForHTTPProxy(socket_pool_type, *proxy_host_port); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (num_preconnect_streams) { 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestSocketsForPool(pool, connection_group, http_proxy_params, 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_preconnect_streams, net_log); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return socket_handle->Init(connection_group, http_proxy_params, 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_priority, callback, 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pool, net_log); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (proxy_info.is_socks()) { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SOCKSClientSocketPool* pool = 294eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch session->GetSocketPoolForSOCKSProxy(socket_pool_type, *proxy_host_port); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (num_preconnect_streams) { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestSocketsForPool(pool, connection_group, socks_params, 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_preconnect_streams, net_log); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return socket_handle->Init(connection_group, socks_params, 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_priority, callback, pool, 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net_log); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(proxy_info.is_direct()); 3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<TransportSocketParams> tcp_params = 3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new TransportSocketParams( 3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci origin_host_port, 3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci disable_resolver_cache, 3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ignore_limits, 3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci resolution_callback, 3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportClientSocketPool* pool = 315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch session->GetTransportSocketPool(socket_pool_type); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (num_preconnect_streams) { 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestSocketsForPool(pool, connection_group, tcp_params, 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_preconnect_streams, net_log); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return socket_handle->Init(connection_group, tcp_params, 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_priority, callback, 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pool, net_log); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ClientSocketPoolManager::ClientSocketPoolManager() {} 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ClientSocketPoolManager::~ClientSocketPoolManager() {} 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ClientSocketPoolManager::max_sockets_per_pool( 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpNetworkSession::SocketPoolType pool_type) { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_LT(pool_type, HttpNetworkSession::NUM_SOCKET_POOL_TYPES); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g_max_sockets_per_pool[pool_type]; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ClientSocketPoolManager::set_max_sockets_per_pool( 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpNetworkSession::SocketPoolType pool_type, 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int socket_count) { 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_LT(0, socket_count); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GT(1000, socket_count); // Sanity check. 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_LT(pool_type, HttpNetworkSession::NUM_SOCKET_POOL_TYPES); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_max_sockets_per_pool[pool_type] = socket_count; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GE(g_max_sockets_per_pool[pool_type], 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_max_sockets_per_group[pool_type]); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ClientSocketPoolManager::max_sockets_per_group( 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpNetworkSession::SocketPoolType pool_type) { 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_LT(pool_type, HttpNetworkSession::NUM_SOCKET_POOL_TYPES); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g_max_sockets_per_group[pool_type]; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ClientSocketPoolManager::set_max_sockets_per_group( 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpNetworkSession::SocketPoolType pool_type, 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int socket_count) { 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_LT(0, socket_count); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The following is a sanity check... but we should NEVER be near this value. 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GT(100, socket_count); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_LT(pool_type, HttpNetworkSession::NUM_SOCKET_POOL_TYPES); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_max_sockets_per_group[pool_type] = socket_count; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GE(g_max_sockets_per_pool[pool_type], 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_max_sockets_per_group[pool_type]); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GE(g_max_sockets_per_proxy_server[pool_type], 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_max_sockets_per_group[pool_type]); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ClientSocketPoolManager::max_sockets_per_proxy_server( 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpNetworkSession::SocketPoolType pool_type) { 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_LT(pool_type, HttpNetworkSession::NUM_SOCKET_POOL_TYPES); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g_max_sockets_per_proxy_server[pool_type]; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ClientSocketPoolManager::set_max_sockets_per_proxy_server( 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpNetworkSession::SocketPoolType pool_type, 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int socket_count) { 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_LT(0, socket_count); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GT(100, socket_count); // Sanity check. 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_LT(pool_type, HttpNetworkSession::NUM_SOCKET_POOL_TYPES); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Assert this case early on. The max number of sockets per group cannot 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // exceed the max number of sockets per proxy server. 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_LE(g_max_sockets_per_group[pool_type], socket_count); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_max_sockets_per_proxy_server[pool_type] = socket_count; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int InitSocketHandleForHttpRequest( 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& request_url, 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpRequestHeaders& request_extra_headers, 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_load_flags, 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestPriority request_priority, 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpNetworkSession* session, 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ProxyInfo& proxy_info, 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool force_spdy_over_ssl, 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool want_spdy_over_npn, 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SSLConfig& ssl_config_for_origin, 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SSLConfig& ssl_config_for_proxy, 40590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PrivacyMode privacy_mode, 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BoundNetLog& net_log, 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientSocketHandle* socket_handle, 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const OnHostResolutionCallback& resolution_callback, 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback) { 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(socket_handle); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InitSocketPoolHelper( 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_url, request_extra_headers, request_load_flags, request_priority, 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session, proxy_info, force_spdy_over_ssl, want_spdy_over_npn, 41490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ssl_config_for_origin, ssl_config_for_proxy, false, privacy_mode, net_log, 415eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 0, socket_handle, HttpNetworkSession::NORMAL_SOCKET_POOL, 416eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch resolution_callback, callback); 417eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 418eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 419eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint InitSocketHandleForWebSocketRequest( 420eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const GURL& request_url, 421eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const HttpRequestHeaders& request_extra_headers, 422eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int request_load_flags, 423eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RequestPriority request_priority, 424eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HttpNetworkSession* session, 425eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const ProxyInfo& proxy_info, 426eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool force_spdy_over_ssl, 427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool want_spdy_over_npn, 428eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const SSLConfig& ssl_config_for_origin, 429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const SSLConfig& ssl_config_for_proxy, 430eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PrivacyMode privacy_mode, 431eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const BoundNetLog& net_log, 432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ClientSocketHandle* socket_handle, 433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const OnHostResolutionCallback& resolution_callback, 434eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const CompletionCallback& callback) { 435eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(socket_handle); 436eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return InitSocketPoolHelper( 437eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch request_url, request_extra_headers, request_load_flags, request_priority, 438eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch session, proxy_info, force_spdy_over_ssl, want_spdy_over_npn, 439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ssl_config_for_origin, ssl_config_for_proxy, true, privacy_mode, net_log, 440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 0, socket_handle, HttpNetworkSession::WEBSOCKET_SOCKET_POOL, 441eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch resolution_callback, callback); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int InitSocketHandleForRawConnect( 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HostPortPair& host_port_pair, 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpNetworkSession* session, 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ProxyInfo& proxy_info, 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SSLConfig& ssl_config_for_origin, 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SSLConfig& ssl_config_for_proxy, 45090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PrivacyMode privacy_mode, 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BoundNetLog& net_log, 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientSocketHandle* socket_handle, 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback) { 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(socket_handle); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Synthesize an HttpRequestInfo. 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL request_url = GURL("http://" + host_port_pair.ToString()); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders request_extra_headers; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_load_flags = 0; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestPriority request_priority = MEDIUM; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InitSocketPoolHelper( 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_url, request_extra_headers, request_load_flags, request_priority, 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session, proxy_info, false, false, ssl_config_for_origin, 46490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ssl_config_for_proxy, true, privacy_mode, net_log, 0, socket_handle, 465a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) HttpNetworkSession::NORMAL_SOCKET_POOL, OnHostResolutionCallback(), 466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) callback); 467a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 468a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 469a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int InitSocketHandleForTlsConnect( 470a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const HostPortPair& host_port_pair, 471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) HttpNetworkSession* session, 472a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const ProxyInfo& proxy_info, 473a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const SSLConfig& ssl_config_for_origin, 474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const SSLConfig& ssl_config_for_proxy, 475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrivacyMode privacy_mode, 476a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const BoundNetLog& net_log, 477a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ClientSocketHandle* socket_handle, 478a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const CompletionCallback& callback) { 479a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(socket_handle); 480a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Synthesize an HttpRequestInfo. 481a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GURL request_url = GURL("https://" + host_port_pair.ToString()); 482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) HttpRequestHeaders request_extra_headers; 483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int request_load_flags = 0; 484a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RequestPriority request_priority = MEDIUM; 485a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 486a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return InitSocketPoolHelper( 487a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) request_url, request_extra_headers, request_load_flags, request_priority, 488a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) session, proxy_info, false, false, ssl_config_for_origin, 489a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ssl_config_for_proxy, true, privacy_mode, net_log, 0, socket_handle, 490eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HttpNetworkSession::NORMAL_SOCKET_POOL, OnHostResolutionCallback(), 491eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch callback); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int PreconnectSocketsForHttpRequest( 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& request_url, 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpRequestHeaders& request_extra_headers, 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_load_flags, 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestPriority request_priority, 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpNetworkSession* session, 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ProxyInfo& proxy_info, 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool force_spdy_over_ssl, 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool want_spdy_over_npn, 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SSLConfig& ssl_config_for_origin, 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SSLConfig& ssl_config_for_proxy, 50590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PrivacyMode privacy_mode, 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BoundNetLog& net_log, 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_preconnect_streams) { 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InitSocketPoolHelper( 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_url, request_extra_headers, request_load_flags, request_priority, 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session, proxy_info, force_spdy_over_ssl, want_spdy_over_npn, 51190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ssl_config_for_origin, ssl_config_for_proxy, false, privacy_mode, net_log, 512eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch num_preconnect_streams, NULL, HttpNetworkSession::NORMAL_SOCKET_POOL, 513eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OnHostResolutionCallback(), CompletionCallback()); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 517