ssl_client_socket_pool.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
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(
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const scoped_refptr<TransportSocketParams>& transport_params,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const scoped_refptr<SOCKSSocketParams>& socks_params,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const scoped_refptr<HttpProxySocketParams>& http_proxy_params,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProxyServer::Scheme proxy,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const HostPortPair& host_and_port,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SSLConfig& ssl_config,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int load_flags,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool force_spdy_over_ssl,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool want_spdy_over_npn)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : transport_params_(transport_params),
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_proxy_params_(http_proxy_params),
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      socks_params_(socks_params),
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proxy_(proxy),
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_and_port_(host_and_port),
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ssl_config_(ssl_config),
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) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (proxy_) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ProxyServer::SCHEME_DIRECT:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(transport_params_.get() != NULL);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(http_proxy_params_.get() == NULL);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(socks_params_.get() == NULL);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ignore_limits_ = transport_params_->ignore_limits();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ProxyServer::SCHEME_HTTP:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ProxyServer::SCHEME_HTTPS:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(transport_params_.get() == NULL);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(http_proxy_params_.get() != NULL);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(socks_params_.get() == NULL);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ignore_limits_ = http_proxy_params_->ignore_limits();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ProxyServer::SCHEME_SOCKS4:
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ProxyServer::SCHEME_SOCKS5:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(transport_params_.get() == NULL);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(http_proxy_params_.get() == NULL);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(socks_params_.get() != NULL);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ignore_limits_ = socks_params_->ignore_limits();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(DFATAL) << "unknown proxy type";
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLSocketParams::~SSLSocketParams() {}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Timeout for the SSL handshake portion of the connect.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kSSLHandshakeTimeoutInSeconds = 30;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLConnectJob::SSLConnectJob(const std::string& group_name,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const scoped_refptr<SSLSocketParams>& params,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const base::TimeDelta& timeout_duration,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             TransportClientSocketPool* transport_pool,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             SOCKSClientSocketPool* socks_pool,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             HttpProxyClientSocketPool* http_proxy_pool,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ClientSocketFactory* client_socket_factory,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             HostResolver* host_resolver,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const SSLClientSocketContext& context,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Delegate* delegate,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             NetLog* net_log)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ConnectJob(group_name, timeout_duration, delegate,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)),
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      params_(params),
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      transport_pool_(transport_pool),
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      socks_pool_(socks_pool),
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_proxy_pool_(http_proxy_pool),
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_socket_factory_(client_socket_factory),
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_resolver_(host_resolver),
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context_(context),
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      callback_(base::Bind(&SSLConnectJob::OnIOComplete,
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           base::Unretained(this))) {}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLConnectJob::~SSLConnectJob() {}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LoadState SSLConnectJob::GetLoadState() const {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (next_state_) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STATE_TUNNEL_CONNECT_COMPLETE:
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (transport_socket_handle_->socket())
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return LOAD_STATE_ESTABLISHING_PROXY_TUNNEL;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // else, fall through.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STATE_TRANSPORT_CONNECT:
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STATE_TRANSPORT_CONNECT_COMPLETE:
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STATE_SOCKS_CONNECT:
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STATE_SOCKS_CONNECT_COMPLETE:
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STATE_TUNNEL_CONNECT:
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return transport_socket_handle_->GetLoadState();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STATE_SSL_CONNECT:
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STATE_SSL_CONNECT_COMPLETE:
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return LOAD_STATE_SSL_HANDSHAKE;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return LOAD_STATE_IDLE;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SSLConnectJob::GetAdditionalErrorState(ClientSocketHandle* handle) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Headers in |error_response_info_| indicate a proxy tunnel setup
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // problem. See DoTunnelConnectComplete.
129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (error_response_info_.headers.get()) {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handle->set_pending_http_proxy_connection(
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        transport_socket_handle_.release());
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handle->set_ssl_error_response_info(error_response_info_);
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!connect_timing_.ssl_start.is_null())
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handle->set_is_ssl_error(true);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SSLConnectJob::OnIOComplete(int result) {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = DoLoop(result);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rv != ERR_IO_PENDING)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyDelegateOfCompletion(rv);  // Deletes |this|.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLConnectJob::DoLoop(int result) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(next_state_, STATE_NONE);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = result;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  do {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    State state = next_state_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    next_state_ = STATE_NONE;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (state) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_TRANSPORT_CONNECT:
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DCHECK_EQ(OK, rv);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rv = DoTransportConnect();
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_TRANSPORT_CONNECT_COMPLETE:
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rv = DoTransportConnectComplete(rv);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_SOCKS_CONNECT:
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DCHECK_EQ(OK, rv);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rv = DoSOCKSConnect();
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_SOCKS_CONNECT_COMPLETE:
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rv = DoSOCKSConnectComplete(rv);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_TUNNEL_CONNECT:
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DCHECK_EQ(OK, rv);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rv = DoTunnelConnect();
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_TUNNEL_CONNECT_COMPLETE:
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rv = DoTunnelConnectComplete(rv);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_SSL_CONNECT:
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DCHECK_EQ(OK, rv);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rv = DoSSLConnect();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_SSL_CONNECT_COMPLETE:
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rv = DoSSLConnectComplete(rv);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED() << "bad state";
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rv = ERR_FAILED;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rv;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLConnectJob::DoTransportConnect() {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(transport_pool_);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  next_state_ = STATE_TRANSPORT_CONNECT_COMPLETE;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  transport_socket_handle_.reset(new ClientSocketHandle());
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<TransportSocketParams> transport_params =
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      params_->transport_params();
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return transport_socket_handle_->Init(
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      group_name(), transport_params,
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      transport_params->destination().priority(), callback_, transport_pool_,
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net_log());
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLConnectJob::DoTransportConnectComplete(int result) {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result == OK)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    next_state_ = STATE_SSL_CONNECT;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLConnectJob::DoSOCKSConnect() {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(socks_pool_);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  next_state_ = STATE_SOCKS_CONNECT_COMPLETE;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  transport_socket_handle_.reset(new ClientSocketHandle());
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SOCKSSocketParams> socks_params = params_->socks_params();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return transport_socket_handle_->Init(
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      group_name(), socks_params, socks_params->destination().priority(),
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback_, socks_pool_, net_log());
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLConnectJob::DoSOCKSConnectComplete(int result) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result == OK)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    next_state_ = STATE_SSL_CONNECT;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLConnectJob::DoTunnelConnect() {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(http_proxy_pool_);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  next_state_ = STATE_TUNNEL_CONNECT_COMPLETE;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  transport_socket_handle_.reset(new ClientSocketHandle());
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<HttpProxySocketParams> http_proxy_params =
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      params_->http_proxy_params();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return transport_socket_handle_->Init(
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      group_name(), http_proxy_params,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_proxy_params->destination().priority(), callback_, http_proxy_pool_,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net_log());
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLConnectJob::DoTunnelConnectComplete(int result) {
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extract the information needed to prompt for appropriate proxy
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // authentication so that when ClientSocketPoolBaseHelper calls
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |GetAdditionalErrorState|, we can easily set the state.
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    error_response_info_ = transport_socket_handle_->ssl_error_response_info();
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (result == ERR_PROXY_AUTH_REQUESTED ||
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             result == ERR_HTTPS_PROXY_TUNNEL_RESPONSE) {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StreamSocket* socket = transport_socket_handle_->socket();
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpProxyClientSocket* tunnel_socket =
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<HttpProxyClientSocket*>(socket);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    error_response_info_ = *tunnel_socket->GetConnectResponseInfo();
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result < 0)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  next_state_ = STATE_SSL_CONNECT;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLConnectJob::DoSSLConnect() {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  next_state_ = STATE_SSL_CONNECT_COMPLETE;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset the timeout to just the time allowed for the SSL handshake.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResetTimer(base::TimeDelta::FromSeconds(kSSLHandshakeTimeoutInSeconds));
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the handle has a fresh socket, get its connect start and DNS times.
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This should always be the case.
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const LoadTimingInfo::ConnectTiming& socket_connect_timing =
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      transport_socket_handle_->connect_timing();
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!transport_socket_handle_->is_reused() &&
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !socket_connect_timing.connect_start.is_null()) {
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Overwriting |connect_start| serves two purposes - it adjusts timing so
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // |connect_start| doesn't include dns times, and it adjusts the time so
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // as not to include time spent waiting for an idle socket.
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connect_timing_.connect_start = socket_connect_timing.connect_start;
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connect_timing_.dns_start = socket_connect_timing.dns_start;
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connect_timing_.dns_end = socket_connect_timing.dns_end;
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connect_timing_.ssl_start = base::TimeTicks::Now();
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ssl_socket_.reset(client_socket_factory_->CreateSSLClientSocket(
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      transport_socket_handle_.release(), params_->host_and_port(),
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      params_->ssl_config(), context_));
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ssl_socket_->Connect(callback_);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLConnectJob::DoSSLConnectComplete(int result) {
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connect_timing_.ssl_end = base::TimeTicks::Now();
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLClientSocket::NextProtoStatus status =
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SSLClientSocket::kNextProtoUnsupported;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string proto;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string server_protos;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GetNextProto will fail and and trigger a NOTREACHED if we pass in a socket
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that hasn't had SSL_ImportFD called on it. If we get a certificate error
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // here, then we know that we called SSL_ImportFD.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result == OK || IsCertificateError(result))
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status = ssl_socket_->GetNextProto(&proto, &server_protos);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we want spdy over npn, make sure it succeeded.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status == SSLClientSocket::kNextProtoNegotiated) {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ssl_socket_->set_was_npn_negotiated(true);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NextProto protocol_negotiated =
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SSLClientSocket::NextProtoFromString(proto);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ssl_socket_->set_protocol_negotiated(protocol_negotiated);
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If we negotiated a SPDY version, it must have been present in
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // SSLConfig::next_protos.
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(mbelshe): Verify this.
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (protocol_negotiated >= kProtoSPDYMinimumVersion &&
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protocol_negotiated <= kProtoSPDYMaximumVersion) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ssl_socket_->set_was_spdy_negotiated(true);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params_->want_spdy_over_npn() && !ssl_socket_->was_spdy_negotiated())
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ERR_NPN_NEGOTIATION_FAILED;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Spdy might be turned on by default, or it might be over npn.
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool using_spdy = params_->force_spdy_over_ssl() ||
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      params_->want_spdy_over_npn();
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result == OK ||
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ssl_socket_->IgnoreCertError(result, params_->load_flags())) {
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(!connect_timing_.ssl_start.is_null());
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeDelta connect_duration =
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        connect_timing_.ssl_end - connect_timing_.ssl_start;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (using_spdy) {
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UMA_HISTOGRAM_CUSTOM_TIMES("Net.SpdyConnectionLatency_2",
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 connect_duration,
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 base::TimeDelta::FromMilliseconds(1),
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 base::TimeDelta::FromMinutes(1),
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 100);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_CUSTOM_TIMES("Net.SSL_Connection_Latency_2",
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               connect_duration,
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               base::TimeDelta::FromMilliseconds(1),
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               base::TimeDelta::FromMinutes(1),
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               100);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SSLInfo ssl_info;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ssl_socket_->GetSSLInfo(&ssl_info);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    UMA_HISTOGRAM_SPARSE_SLOWLY("Net.SSL_CipherSuite",
344eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                SSLConnectionStatusToCipherSuite(
345eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                    ssl_info.connection_status));
346eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ssl_info.handshake_type == SSLInfo::HANDSHAKE_RESUME) {
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UMA_HISTOGRAM_CUSTOM_TIMES("Net.SSL_Connection_Latency_Resume_Handshake",
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 connect_duration,
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 base::TimeDelta::FromMilliseconds(1),
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 base::TimeDelta::FromMinutes(1),
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 100);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (ssl_info.handshake_type == SSLInfo::HANDSHAKE_FULL) {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UMA_HISTOGRAM_CUSTOM_TIMES("Net.SSL_Connection_Latency_Full_Handshake",
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 connect_duration,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 base::TimeDelta::FromMilliseconds(1),
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 base::TimeDelta::FromMinutes(1),
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 100);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& host = params_->host_and_port().host();
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_google = host == "google.com" ||
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     (host.size() > 11 &&
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      host.rfind(".google.com") == host.size() - 11);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (is_google) {
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UMA_HISTOGRAM_CUSTOM_TIMES("Net.SSL_Connection_Latency_Google2",
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 connect_duration,
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 base::TimeDelta::FromMilliseconds(1),
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 base::TimeDelta::FromMinutes(1),
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 100);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ssl_info.handshake_type == SSLInfo::HANDSHAKE_RESUME) {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UMA_HISTOGRAM_CUSTOM_TIMES("Net.SSL_Connection_Latency_Google_"
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       "Resume_Handshake",
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   connect_duration,
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   base::TimeDelta::FromMilliseconds(1),
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   base::TimeDelta::FromMinutes(1),
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   100);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else if (ssl_info.handshake_type == SSLInfo::HANDSHAKE_FULL) {
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UMA_HISTOGRAM_CUSTOM_TIMES("Net.SSL_Connection_Latency_Google_"
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       "Full_Handshake",
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   connect_duration,
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   base::TimeDelta::FromMilliseconds(1),
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   base::TimeDelta::FromMinutes(1),
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   100);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result == OK || IsCertificateError(result)) {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_socket(ssl_socket_.release());
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) {
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    error_response_info_.cert_request_info = new SSLCertRequestInfo;
393868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ssl_socket_->GetSSLCertRequestInfo(
394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        error_response_info_.cert_request_info.get());
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLConnectJob::ConnectInternal() {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (params_->proxy()) {
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ProxyServer::SCHEME_DIRECT:
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      next_state_ = STATE_TRANSPORT_CONNECT;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ProxyServer::SCHEME_HTTP:
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ProxyServer::SCHEME_HTTPS:
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      next_state_ = STATE_TUNNEL_CONNECT;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ProxyServer::SCHEME_SOCKS4:
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ProxyServer::SCHEME_SOCKS5:
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      next_state_ = STATE_SOCKS_CONNECT;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "unknown proxy type";
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return DoLoop(OK);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLClientSocketPool::SSLConnectJobFactory::SSLConnectJobFactory(
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TransportClientSocketPool* transport_pool,
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SOCKSClientSocketPool* socks_pool,
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpProxyClientSocketPool* http_proxy_pool,
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClientSocketFactory* client_socket_factory,
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HostResolver* host_resolver,
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SSLClientSocketContext& context,
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NetLog* net_log)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : transport_pool_(transport_pool),
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      socks_pool_(socks_pool),
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_proxy_pool_(http_proxy_pool),
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_socket_factory_(client_socket_factory),
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_resolver_(host_resolver),
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context_(context),
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net_log_(net_log) {
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta max_transport_timeout = base::TimeDelta();
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta pool_timeout;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (transport_pool_)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    max_transport_timeout = transport_pool_->ConnectionTimeout();
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (socks_pool_) {
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pool_timeout = socks_pool_->ConnectionTimeout();
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pool_timeout > max_transport_timeout)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      max_transport_timeout = pool_timeout;
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (http_proxy_pool_) {
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pool_timeout = http_proxy_pool_->ConnectionTimeout();
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pool_timeout > max_transport_timeout)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      max_transport_timeout = pool_timeout;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  timeout_ = max_transport_timeout +
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromSeconds(kSSLHandshakeTimeoutInSeconds);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLClientSocketPool::SSLClientSocketPool(
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int max_sockets,
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int max_sockets_per_group,
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClientSocketPoolHistograms* histograms,
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HostResolver* host_resolver,
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CertVerifier* cert_verifier,
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ServerBoundCertService* server_bound_cert_service,
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TransportSecurityState* transport_security_state,
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& ssl_session_cache_shard,
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClientSocketFactory* client_socket_factory,
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TransportClientSocketPool* transport_pool,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SOCKSClientSocketPool* socks_pool,
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpProxyClientSocketPool* http_proxy_pool,
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SSLConfigService* ssl_config_service,
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NetLog* net_log)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : transport_pool_(transport_pool),
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      socks_pool_(socks_pool),
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_proxy_pool_(http_proxy_pool),
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base_(max_sockets, max_sockets_per_group, histograms,
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ClientSocketPool::unused_idle_socket_timeout(),
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ClientSocketPool::used_idle_socket_timeout(),
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            new SSLConnectJobFactory(transport_pool,
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     socks_pool,
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     http_proxy_pool,
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     client_socket_factory,
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     host_resolver,
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     SSLClientSocketContext(
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         cert_verifier,
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         server_bound_cert_service,
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         transport_security_state,
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         ssl_session_cache_shard),
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     net_log)),
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ssl_config_service_(ssl_config_service) {
486868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (ssl_config_service_.get())
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ssl_config_service_->AddObserver(this);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (transport_pool_)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    transport_pool_->AddLayeredPool(this);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (socks_pool_)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    socks_pool_->AddLayeredPool(this);
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (http_proxy_pool_)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    http_proxy_pool_->AddLayeredPool(this);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLClientSocketPool::~SSLClientSocketPool() {
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (http_proxy_pool_)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    http_proxy_pool_->RemoveLayeredPool(this);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (socks_pool_)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    socks_pool_->RemoveLayeredPool(this);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (transport_pool_)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    transport_pool_->RemoveLayeredPool(this);
503868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (ssl_config_service_.get())
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ssl_config_service_->RemoveObserver(this);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ConnectJob* SSLClientSocketPool::SSLConnectJobFactory::NewConnectJob(
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& group_name,
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PoolBase::Request& request,
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ConnectJob::Delegate* delegate) const {
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new SSLConnectJob(group_name, request.params(), ConnectionTimeout(),
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           transport_pool_, socks_pool_, http_proxy_pool_,
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           client_socket_factory_, host_resolver_,
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           context_, delegate, net_log_);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TimeDelta
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLClientSocketPool::SSLConnectJobFactory::ConnectionTimeout() const {
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return timeout_;
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLClientSocketPool::RequestSocket(const std::string& group_name,
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const void* socket_params,
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       RequestPriority priority,
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       ClientSocketHandle* handle,
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const CompletionCallback& callback,
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const BoundNetLog& net_log) {
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const scoped_refptr<SSLSocketParams>* casted_socket_params =
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<const scoped_refptr<SSLSocketParams>*>(socket_params);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base_.RequestSocket(group_name, *casted_socket_params, priority,
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             handle, callback, net_log);
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SSLClientSocketPool::RequestSockets(
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& group_name,
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const void* params,
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int num_sockets,
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const BoundNetLog& net_log) {
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const scoped_refptr<SSLSocketParams>* casted_params =
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<const scoped_refptr<SSLSocketParams>*>(params);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base_.RequestSockets(group_name, *casted_params, num_sockets, net_log);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SSLClientSocketPool::CancelRequest(const std::string& group_name,
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        ClientSocketHandle* handle) {
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base_.CancelRequest(group_name, handle);
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SSLClientSocketPool::ReleaseSocket(const std::string& group_name,
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        StreamSocket* socket, int id) {
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base_.ReleaseSocket(group_name, socket, id);
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SSLClientSocketPool::FlushWithError(int error) {
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base_.FlushWithError(error);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SSLClientSocketPool::IsStalled() const {
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base_.IsStalled() ||
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (transport_pool_ && transport_pool_->IsStalled()) ||
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (socks_pool_ && socks_pool_->IsStalled()) ||
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (http_proxy_pool_ && http_proxy_pool_->IsStalled());
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SSLClientSocketPool::CloseIdleSockets() {
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base_.CloseIdleSockets();
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLClientSocketPool::IdleSocketCount() const {
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base_.idle_socket_count();
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SSLClientSocketPool::IdleSocketCountInGroup(
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& group_name) const {
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base_.IdleSocketCountInGroup(group_name);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LoadState SSLClientSocketPool::GetLoadState(
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& group_name, const ClientSocketHandle* handle) const {
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base_.GetLoadState(group_name, handle);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SSLClientSocketPool::AddLayeredPool(LayeredPool* layered_pool) {
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base_.AddLayeredPool(layered_pool);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SSLClientSocketPool::RemoveLayeredPool(LayeredPool* layered_pool) {
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base_.RemoveLayeredPool(layered_pool);
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::DictionaryValue* SSLClientSocketPool::GetInfoAsValue(
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& name,
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& type,
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool include_nested_pools) const {
5977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* dict = base_.GetInfoAsValue(name, type);
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (include_nested_pools) {
5997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    base::ListValue* list = new base::ListValue();
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (transport_pool_) {
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      list->Append(transport_pool_->GetInfoAsValue("transport_socket_pool",
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   "transport_socket_pool",
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   false));
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (socks_pool_) {
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      list->Append(socks_pool_->GetInfoAsValue("socks_pool",
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "socks_pool",
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               true));
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (http_proxy_pool_) {
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      list->Append(http_proxy_pool_->GetInfoAsValue("http_proxy_pool",
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    "http_proxy_pool",
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    true));
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->Set("nested_pools", list);
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dict;
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TimeDelta SSLClientSocketPool::ConnectionTimeout() const {
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base_.ConnectionTimeout();
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ClientSocketPoolHistograms* SSLClientSocketPool::histograms() const {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base_.histograms();
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SSLClientSocketPool::OnSSLConfigChanged() {
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FlushWithError(ERR_NETWORK_CHANGED);
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SSLClientSocketPool::CloseOneIdleConnection() {
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (base_.CloseOneIdleSocket())
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base_.CloseOneIdleConnectionInLayeredPool();
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
639