ssl_client_socket_pool.cc revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
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/ssl_client_socket_pool.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/field_trial.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/metrics/sparse_histogram.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/host_port_pair.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/net_errors.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_proxy_client_socket.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_proxy_client_socket_pool.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/client_socket_factory.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/client_socket_handle.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/socks_client_socket_pool.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/ssl_client_socket.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/transport_client_socket_pool.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_cert_request_info.h"
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/ssl/ssl_connection_status_flags.h"
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/ssl/ssl_info.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLSocketParams::SSLSocketParams(
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const scoped_refptr<TransportSocketParams>& direct_params,
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const scoped_refptr<SOCKSSocketParams>& socks_proxy_params,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const scoped_refptr<HttpProxySocketParams>& http_proxy_params,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const HostPortPair& host_and_port,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SSLConfig& ssl_config,
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    PrivacyMode privacy_mode,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int load_flags,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool force_spdy_over_ssl,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool want_spdy_over_npn)
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    : direct_params_(direct_params),
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      socks_proxy_params_(socks_proxy_params),
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_proxy_params_(http_proxy_params),
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_and_port_(host_and_port),
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ssl_config_(ssl_config),
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      privacy_mode_(privacy_mode),
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      load_flags_(load_flags),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      force_spdy_over_ssl_(force_spdy_over_ssl),
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      want_spdy_over_npn_(want_spdy_over_npn),
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ignore_limits_(false) {
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (direct_params_) {
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DCHECK(!socks_proxy_params_);
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DCHECK(!http_proxy_params_);
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ignore_limits_ = direct_params_->ignore_limits();
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  } else if (socks_proxy_params_) {
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DCHECK(!http_proxy_params_);
543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ignore_limits_ = socks_proxy_params_->ignore_limits();
553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  } else {
563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DCHECK(http_proxy_params_);
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ignore_limits_ = http_proxy_params_->ignore_limits();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLSocketParams::~SSLSocketParams() {}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SSLSocketParams::ConnectionType SSLSocketParams::GetConnectionType() const {
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (direct_params_) {
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DCHECK(!socks_proxy_params_);
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DCHECK(!http_proxy_params_);
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return DIRECT;
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (socks_proxy_params_) {
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DCHECK(!http_proxy_params_);
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return SOCKS_PROXY;
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK(http_proxy_params_);
763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return HTTP_PROXY;
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const scoped_refptr<TransportSocketParams>&
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SSLSocketParams::GetDirectConnectionParams() const {
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK_EQ(GetConnectionType(), DIRECT);
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return direct_params_;
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const scoped_refptr<SOCKSSocketParams>&
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SSLSocketParams::GetSocksProxyConnectionParams() const {
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK_EQ(GetConnectionType(), SOCKS_PROXY);
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return socks_proxy_params_;
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const scoped_refptr<HttpProxySocketParams>&
923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SSLSocketParams::GetHttpProxyConnectionParams() const {
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK_EQ(GetConnectionType(), HTTP_PROXY);
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return http_proxy_params_;
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Timeout for the SSL handshake portion of the connect.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kSSLHandshakeTimeoutInSeconds = 30;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLConnectJob::SSLConnectJob(const std::string& group_name,
1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                             RequestPriority priority,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const scoped_refptr<SSLSocketParams>& params,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const base::TimeDelta& timeout_duration,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             TransportClientSocketPool* transport_pool,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             SOCKSClientSocketPool* socks_pool,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             HttpProxyClientSocketPool* http_proxy_pool,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ClientSocketFactory* client_socket_factory,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             HostResolver* host_resolver,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const SSLClientSocketContext& context,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Delegate* delegate,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             NetLog* net_log)
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : ConnectJob(group_name,
1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 timeout_duration,
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                 priority,
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 delegate,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)),
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      params_(params),
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      transport_pool_(transport_pool),
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      socks_pool_(socks_pool),
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_proxy_pool_(http_proxy_pool),
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_socket_factory_(client_socket_factory),
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_resolver_(host_resolver),
1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      context_(context.cert_verifier,
1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               context.server_bound_cert_service,
1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               context.transport_security_state,
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)               context.cert_transparency_verifier,
127e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch               (params->privacy_mode() == PRIVACY_MODE_ENABLED
1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    ? "pm/" + context.ssl_session_cache_shard
1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    : context.ssl_session_cache_shard)),
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      callback_(base::Bind(&SSLConnectJob::OnIOComplete,
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           base::Unretained(this))) {}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLConnectJob::~SSLConnectJob() {}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LoadState SSLConnectJob::GetLoadState() const {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (next_state_) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STATE_TUNNEL_CONNECT_COMPLETE:
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (transport_socket_handle_->socket())
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return LOAD_STATE_ESTABLISHING_PROXY_TUNNEL;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // else, fall through.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STATE_TRANSPORT_CONNECT:
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STATE_TRANSPORT_CONNECT_COMPLETE:
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STATE_SOCKS_CONNECT:
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STATE_SOCKS_CONNECT_COMPLETE:
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STATE_TUNNEL_CONNECT:
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return transport_socket_handle_->GetLoadState();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STATE_SSL_CONNECT:
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STATE_SSL_CONNECT_COMPLETE:
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return LOAD_STATE_SSL_HANDSHAKE;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return LOAD_STATE_IDLE;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SSLConnectJob::GetAdditionalErrorState(ClientSocketHandle* handle) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Headers in |error_response_info_| indicate a proxy tunnel setup
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // problem. See DoTunnelConnectComplete.
159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (error_response_info_.headers.get()) {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handle->set_pending_http_proxy_connection(
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        transport_socket_handle_.release());
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handle->set_ssl_error_response_info(error_response_info_);
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!connect_timing_.ssl_start.is_null())
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handle->set_is_ssl_error(true);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SSLConnectJob::OnIOComplete(int result) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = DoLoop(result);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rv != ERR_IO_PENDING)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyDelegateOfCompletion(rv);  // Deletes |this|.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLConnectJob::DoLoop(int result) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(next_state_, STATE_NONE);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = result;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  do {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    State state = next_state_;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    next_state_ = STATE_NONE;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (state) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_TRANSPORT_CONNECT:
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DCHECK_EQ(OK, rv);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rv = DoTransportConnect();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_TRANSPORT_CONNECT_COMPLETE:
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rv = DoTransportConnectComplete(rv);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_SOCKS_CONNECT:
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DCHECK_EQ(OK, rv);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rv = DoSOCKSConnect();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_SOCKS_CONNECT_COMPLETE:
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rv = DoSOCKSConnectComplete(rv);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_TUNNEL_CONNECT:
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DCHECK_EQ(OK, rv);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rv = DoTunnelConnect();
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_TUNNEL_CONNECT_COMPLETE:
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rv = DoTunnelConnectComplete(rv);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_SSL_CONNECT:
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DCHECK_EQ(OK, rv);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rv = DoSSLConnect();
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_SSL_CONNECT_COMPLETE:
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rv = DoSSLConnectComplete(rv);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED() << "bad state";
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rv = ERR_FAILED;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rv;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLConnectJob::DoTransportConnect() {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(transport_pool_);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  next_state_ = STATE_TRANSPORT_CONNECT_COMPLETE;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  transport_socket_handle_.reset(new ClientSocketHandle());
2253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_refptr<TransportSocketParams> direct_params =
2263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      params_->GetDirectConnectionParams();
2273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return transport_socket_handle_->Init(group_name(),
2283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                        direct_params,
2293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                        priority(),
2303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                        callback_,
2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                        transport_pool_,
2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                        net_log());
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLConnectJob::DoTransportConnectComplete(int result) {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result == OK)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    next_state_ = STATE_SSL_CONNECT;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLConnectJob::DoSOCKSConnect() {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(socks_pool_);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  next_state_ = STATE_SOCKS_CONNECT_COMPLETE;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  transport_socket_handle_.reset(new ClientSocketHandle());
2463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_refptr<SOCKSSocketParams> socks_proxy_params =
2473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      params_->GetSocksProxyConnectionParams();
2483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return transport_socket_handle_->Init(group_name(),
2493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                        socks_proxy_params,
2503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                        priority(),
2513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                        callback_,
2523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                        socks_pool_,
2533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                        net_log());
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLConnectJob::DoSOCKSConnectComplete(int result) {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result == OK)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    next_state_ = STATE_SSL_CONNECT;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLConnectJob::DoTunnelConnect() {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(http_proxy_pool_);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  next_state_ = STATE_TUNNEL_CONNECT_COMPLETE;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  transport_socket_handle_.reset(new ClientSocketHandle());
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<HttpProxySocketParams> http_proxy_params =
2693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      params_->GetHttpProxyConnectionParams();
2703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return transport_socket_handle_->Init(group_name(),
2713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                        http_proxy_params,
2723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                        priority(),
2733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                        callback_,
2743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                        http_proxy_pool_,
2753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                        net_log());
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLConnectJob::DoTunnelConnectComplete(int result) {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extract the information needed to prompt for appropriate proxy
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // authentication so that when ClientSocketPoolBaseHelper calls
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |GetAdditionalErrorState|, we can easily set the state.
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    error_response_info_ = transport_socket_handle_->ssl_error_response_info();
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (result == ERR_PROXY_AUTH_REQUESTED ||
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             result == ERR_HTTPS_PROXY_TUNNEL_RESPONSE) {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StreamSocket* socket = transport_socket_handle_->socket();
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpProxyClientSocket* tunnel_socket =
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<HttpProxyClientSocket*>(socket);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    error_response_info_ = *tunnel_socket->GetConnectResponseInfo();
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result < 0)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  next_state_ = STATE_SSL_CONNECT;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLConnectJob::DoSSLConnect() {
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  next_state_ = STATE_SSL_CONNECT_COMPLETE;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset the timeout to just the time allowed for the SSL handshake.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResetTimer(base::TimeDelta::FromSeconds(kSSLHandshakeTimeoutInSeconds));
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the handle has a fresh socket, get its connect start and DNS times.
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This should always be the case.
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const LoadTimingInfo::ConnectTiming& socket_connect_timing =
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      transport_socket_handle_->connect_timing();
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!transport_socket_handle_->is_reused() &&
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !socket_connect_timing.connect_start.is_null()) {
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Overwriting |connect_start| serves two purposes - it adjusts timing so
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // |connect_start| doesn't include dns times, and it adjusts the time so
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // as not to include time spent waiting for an idle socket.
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connect_timing_.connect_start = socket_connect_timing.connect_start;
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connect_timing_.dns_start = socket_connect_timing.dns_start;
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connect_timing_.dns_end = socket_connect_timing.dns_end;
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connect_timing_.ssl_start = base::TimeTicks::Now();
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ssl_socket_ = client_socket_factory_->CreateSSLClientSocket(
3203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      transport_socket_handle_.Pass(),
3217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      params_->host_and_port(),
3227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      params_->ssl_config(),
3233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      context_);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ssl_socket_->Connect(callback_);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLConnectJob::DoSSLConnectComplete(int result) {
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connect_timing_.ssl_end = base::TimeTicks::Now();
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLClientSocket::NextProtoStatus status =
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SSLClientSocket::kNextProtoUnsupported;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string proto;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string server_protos;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GetNextProto will fail and and trigger a NOTREACHED if we pass in a socket
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that hasn't had SSL_ImportFD called on it. If we get a certificate error
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // here, then we know that we called SSL_ImportFD.
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result == OK || IsCertificateError(result))
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status = ssl_socket_->GetNextProto(&proto, &server_protos);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we want spdy over npn, make sure it succeeded.
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status == SSLClientSocket::kNextProtoNegotiated) {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ssl_socket_->set_was_npn_negotiated(true);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NextProto protocol_negotiated =
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SSLClientSocket::NextProtoFromString(proto);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ssl_socket_->set_protocol_negotiated(protocol_negotiated);
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If we negotiated a SPDY version, it must have been present in
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // SSLConfig::next_protos.
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(mbelshe): Verify this.
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (protocol_negotiated >= kProtoSPDYMinimumVersion &&
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protocol_negotiated <= kProtoSPDYMaximumVersion) {
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ssl_socket_->set_was_spdy_negotiated(true);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params_->want_spdy_over_npn() && !ssl_socket_->was_spdy_negotiated())
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ERR_NPN_NEGOTIATION_FAILED;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Spdy might be turned on by default, or it might be over npn.
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool using_spdy = params_->force_spdy_over_ssl() ||
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      params_->want_spdy_over_npn();
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result == OK ||
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ssl_socket_->IgnoreCertError(result, params_->load_flags())) {
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(!connect_timing_.ssl_start.is_null());
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeDelta connect_duration =
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        connect_timing_.ssl_end - connect_timing_.ssl_start;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (using_spdy) {
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UMA_HISTOGRAM_CUSTOM_TIMES("Net.SpdyConnectionLatency_2",
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 connect_duration,
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 base::TimeDelta::FromMilliseconds(1),
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 base::TimeDelta::FromMinutes(1),
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 100);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(SPDY_PROXY_AUTH_ORIGIN)
3747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    bool using_data_reduction_proxy = params_->host_and_port().Equals(
3757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        HostPortPair::FromURL(GURL(SPDY_PROXY_AUTH_ORIGIN)));
3767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (using_data_reduction_proxy) {
3777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      UMA_HISTOGRAM_CUSTOM_TIMES(
3787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          "Net.SSL_Connection_Latency_DataReductionProxy",
3797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          connect_duration,
3807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          base::TimeDelta::FromMilliseconds(1),
3817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          base::TimeDelta::FromMinutes(1),
3827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          100);
3837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
3847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_CUSTOM_TIMES("Net.SSL_Connection_Latency_2",
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               connect_duration,
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               base::TimeDelta::FromMilliseconds(1),
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               base::TimeDelta::FromMinutes(1),
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               100);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SSLInfo ssl_info;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ssl_socket_->GetSSLInfo(&ssl_info);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    UMA_HISTOGRAM_SPARSE_SLOWLY("Net.SSL_CipherSuite",
396eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                SSLConnectionStatusToCipherSuite(
397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                    ssl_info.connection_status));
398eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ssl_info.handshake_type == SSLInfo::HANDSHAKE_RESUME) {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UMA_HISTOGRAM_CUSTOM_TIMES("Net.SSL_Connection_Latency_Resume_Handshake",
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 connect_duration,
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 base::TimeDelta::FromMilliseconds(1),
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 base::TimeDelta::FromMinutes(1),
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 100);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (ssl_info.handshake_type == SSLInfo::HANDSHAKE_FULL) {
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UMA_HISTOGRAM_CUSTOM_TIMES("Net.SSL_Connection_Latency_Full_Handshake",
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 connect_duration,
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 base::TimeDelta::FromMilliseconds(1),
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 base::TimeDelta::FromMinutes(1),
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 100);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& host = params_->host_and_port().host();
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_google = host == "google.com" ||
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     (host.size() > 11 &&
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      host.rfind(".google.com") == host.size() - 11);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (is_google) {
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UMA_HISTOGRAM_CUSTOM_TIMES("Net.SSL_Connection_Latency_Google2",
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 connect_duration,
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 base::TimeDelta::FromMilliseconds(1),
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 base::TimeDelta::FromMinutes(1),
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 100);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ssl_info.handshake_type == SSLInfo::HANDSHAKE_RESUME) {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UMA_HISTOGRAM_CUSTOM_TIMES("Net.SSL_Connection_Latency_Google_"
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       "Resume_Handshake",
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   connect_duration,
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   base::TimeDelta::FromMilliseconds(1),
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   base::TimeDelta::FromMinutes(1),
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   100);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else if (ssl_info.handshake_type == SSLInfo::HANDSHAKE_FULL) {
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UMA_HISTOGRAM_CUSTOM_TIMES("Net.SSL_Connection_Latency_Google_"
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       "Full_Handshake",
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   connect_duration,
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   base::TimeDelta::FromMilliseconds(1),
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   base::TimeDelta::FromMinutes(1),
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   100);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result == OK || IsCertificateError(result)) {
4423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    SetSocket(ssl_socket_.PassAs<StreamSocket>());
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) {
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    error_response_info_.cert_request_info = new SSLCertRequestInfo;
445868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ssl_socket_->GetSSLCertRequestInfo(
446868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        error_response_info_.cert_request_info.get());
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SSLConnectJob::State SSLConnectJob::GetInitialState(
4533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    SSLSocketParams::ConnectionType connection_type) {
4543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  switch (connection_type) {
4553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case SSLSocketParams::DIRECT:
4563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return STATE_TRANSPORT_CONNECT;
4573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case SSLSocketParams::HTTP_PROXY:
4583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return STATE_TUNNEL_CONNECT;
4593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case SSLSocketParams::SOCKS_PROXY:
4603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return STATE_SOCKS_CONNECT;
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  NOTREACHED();
4633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return STATE_NONE;
4643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
4653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int SSLConnectJob::ConnectInternal() {
4673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  next_state_ = GetInitialState(params_->GetConnectionType());
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return DoLoop(OK);
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLClientSocketPool::SSLConnectJobFactory::SSLConnectJobFactory(
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TransportClientSocketPool* transport_pool,
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SOCKSClientSocketPool* socks_pool,
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpProxyClientSocketPool* http_proxy_pool,
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClientSocketFactory* client_socket_factory,
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HostResolver* host_resolver,
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SSLClientSocketContext& context,
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NetLog* net_log)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : transport_pool_(transport_pool),
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      socks_pool_(socks_pool),
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_proxy_pool_(http_proxy_pool),
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_socket_factory_(client_socket_factory),
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_resolver_(host_resolver),
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context_(context),
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net_log_(net_log) {
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta max_transport_timeout = base::TimeDelta();
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta pool_timeout;
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (transport_pool_)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    max_transport_timeout = transport_pool_->ConnectionTimeout();
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (socks_pool_) {
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pool_timeout = socks_pool_->ConnectionTimeout();
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pool_timeout > max_transport_timeout)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      max_transport_timeout = pool_timeout;
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (http_proxy_pool_) {
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pool_timeout = http_proxy_pool_->ConnectionTimeout();
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pool_timeout > max_transport_timeout)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      max_transport_timeout = pool_timeout;
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  timeout_ = max_transport_timeout +
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromSeconds(kSSLHandshakeTimeoutInSeconds);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLClientSocketPool::SSLClientSocketPool(
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int max_sockets,
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int max_sockets_per_group,
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClientSocketPoolHistograms* histograms,
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HostResolver* host_resolver,
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CertVerifier* cert_verifier,
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ServerBoundCertService* server_bound_cert_service,
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TransportSecurityState* transport_security_state,
512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    CTVerifier* cert_transparency_verifier,
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& ssl_session_cache_shard,
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClientSocketFactory* client_socket_factory,
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TransportClientSocketPool* transport_pool,
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SOCKSClientSocketPool* socks_pool,
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpProxyClientSocketPool* http_proxy_pool,
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SSLConfigService* ssl_config_service,
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NetLog* net_log)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : transport_pool_(transport_pool),
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      socks_pool_(socks_pool),
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_proxy_pool_(http_proxy_pool),
5233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      base_(this, max_sockets, max_sockets_per_group, histograms,
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ClientSocketPool::unused_idle_socket_timeout(),
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ClientSocketPool::used_idle_socket_timeout(),
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            new SSLConnectJobFactory(transport_pool,
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     socks_pool,
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     http_proxy_pool,
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     client_socket_factory,
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     host_resolver,
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     SSLClientSocketContext(
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         cert_verifier,
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         server_bound_cert_service,
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         transport_security_state,
535a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                         cert_transparency_verifier,
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         ssl_session_cache_shard),
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     net_log)),
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ssl_config_service_(ssl_config_service) {
539868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (ssl_config_service_.get())
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ssl_config_service_->AddObserver(this);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (transport_pool_)
5423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    base_.AddLowerLayeredPool(transport_pool_);
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (socks_pool_)
5443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    base_.AddLowerLayeredPool(socks_pool_);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (http_proxy_pool_)
5463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    base_.AddLowerLayeredPool(http_proxy_pool_);
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLClientSocketPool::~SSLClientSocketPool() {
550868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (ssl_config_service_.get())
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ssl_config_service_->RemoveObserver(this);
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)scoped_ptr<ConnectJob>
5553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SSLClientSocketPool::SSLConnectJobFactory::NewConnectJob(
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& group_name,
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PoolBase::Request& request,
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ConnectJob::Delegate* delegate) const {
5593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return scoped_ptr<ConnectJob>(
5603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new SSLConnectJob(group_name, request.priority(), request.params(),
5613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                        ConnectionTimeout(), transport_pool_, socks_pool_,
5623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                        http_proxy_pool_, client_socket_factory_,
5633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                        host_resolver_, context_, delegate, net_log_));
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TimeDelta
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLClientSocketPool::SSLConnectJobFactory::ConnectionTimeout() const {
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return timeout_;
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLClientSocketPool::RequestSocket(const std::string& group_name,
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const void* socket_params,
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       RequestPriority priority,
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       ClientSocketHandle* handle,
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const CompletionCallback& callback,
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const BoundNetLog& net_log) {
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const scoped_refptr<SSLSocketParams>* casted_socket_params =
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<const scoped_refptr<SSLSocketParams>*>(socket_params);
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base_.RequestSocket(group_name, *casted_socket_params, priority,
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             handle, callback, net_log);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SSLClientSocketPool::RequestSockets(
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& group_name,
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const void* params,
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int num_sockets,
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const BoundNetLog& net_log) {
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const scoped_refptr<SSLSocketParams>* casted_params =
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<const scoped_refptr<SSLSocketParams>*>(params);
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base_.RequestSockets(group_name, *casted_params, num_sockets, net_log);
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SSLClientSocketPool::CancelRequest(const std::string& group_name,
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        ClientSocketHandle* handle) {
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base_.CancelRequest(group_name, handle);
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SSLClientSocketPool::ReleaseSocket(const std::string& group_name,
6013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                        scoped_ptr<StreamSocket> socket,
6023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                        int id) {
6033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base_.ReleaseSocket(group_name, socket.Pass(), id);
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SSLClientSocketPool::FlushWithError(int error) {
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base_.FlushWithError(error);
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SSLClientSocketPool::CloseIdleSockets() {
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base_.CloseIdleSockets();
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLClientSocketPool::IdleSocketCount() const {
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base_.idle_socket_count();
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLClientSocketPool::IdleSocketCountInGroup(
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& group_name) const {
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base_.IdleSocketCountInGroup(group_name);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LoadState SSLClientSocketPool::GetLoadState(
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& group_name, const ClientSocketHandle* handle) const {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base_.GetLoadState(group_name, handle);
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::DictionaryValue* SSLClientSocketPool::GetInfoAsValue(
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& name,
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& type,
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool include_nested_pools) const {
6327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* dict = base_.GetInfoAsValue(name, type);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (include_nested_pools) {
6347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    base::ListValue* list = new base::ListValue();
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (transport_pool_) {
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      list->Append(transport_pool_->GetInfoAsValue("transport_socket_pool",
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   "transport_socket_pool",
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   false));
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (socks_pool_) {
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      list->Append(socks_pool_->GetInfoAsValue("socks_pool",
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "socks_pool",
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               true));
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (http_proxy_pool_) {
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      list->Append(http_proxy_pool_->GetInfoAsValue("http_proxy_pool",
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    "http_proxy_pool",
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    true));
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->Set("nested_pools", list);
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dict;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TimeDelta SSLClientSocketPool::ConnectionTimeout() const {
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base_.ConnectionTimeout();
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ClientSocketPoolHistograms* SSLClientSocketPool::histograms() const {
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base_.histograms();
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool SSLClientSocketPool::IsStalled() const {
6643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return base_.IsStalled();
6653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
6663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void SSLClientSocketPool::AddHigherLayeredPool(HigherLayeredPool* higher_pool) {
6683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base_.AddHigherLayeredPool(higher_pool);
6693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
6703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void SSLClientSocketPool::RemoveHigherLayeredPool(
6723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    HigherLayeredPool* higher_pool) {
6733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base_.RemoveHigherLayeredPool(higher_pool);
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SSLClientSocketPool::CloseOneIdleConnection() {
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (base_.CloseOneIdleSocket())
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
6793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return base_.CloseOneIdleConnectionInHigherLayeredPool();
6803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
6813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void SSLClientSocketPool::OnSSLConfigChanged() {
6833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FlushWithError(ERR_NETWORK_CHANGED);
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
687