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