1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/socket/ssl_client_socket_pool.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/metrics/field_trial.h"
8731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/metrics/histogram.h"
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/values.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_errors.h"
114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "net/base/host_port_pair.h"
123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/base/ssl_cert_request_info.h"
133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/http/http_proxy_client_socket.h"
143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/http/http_proxy_client_socket_pool.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/socket/client_socket_factory.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/socket/client_socket_handle.h"
173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/socket/socks_client_socket_pool.h"
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/socket/ssl_client_socket.h"
19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "net/socket/ssl_host_info.h"
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "net/socket/transport_client_socket_pool.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace net {
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSSLSocketParams::SSLSocketParams(
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const scoped_refptr<TransportSocketParams>& transport_params,
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const scoped_refptr<SOCKSSocketParams>& socks_params,
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const scoped_refptr<HttpProxySocketParams>& http_proxy_params,
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ProxyServer::Scheme proxy,
294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    const HostPortPair& host_and_port,
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const SSLConfig& ssl_config,
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int load_flags,
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool force_spdy_over_ssl,
333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool want_spdy_over_npn)
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : transport_params_(transport_params),
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      http_proxy_params_(http_proxy_params),
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      socks_params_(socks_params),
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      proxy_(proxy),
384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      host_and_port_(host_and_port),
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ssl_config_(ssl_config),
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      load_flags_(load_flags),
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      force_spdy_over_ssl_(force_spdy_over_ssl),
42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      want_spdy_over_npn_(want_spdy_over_npn) {
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (proxy_) {
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case ProxyServer::SCHEME_DIRECT:
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DCHECK(transport_params_.get() != NULL);
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      DCHECK(http_proxy_params_.get() == NULL);
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      DCHECK(socks_params_.get() == NULL);
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ignore_limits_ = transport_params_->ignore_limits();
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case ProxyServer::SCHEME_HTTP:
513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    case ProxyServer::SCHEME_HTTPS:
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DCHECK(transport_params_.get() == NULL);
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      DCHECK(http_proxy_params_.get() != NULL);
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      DCHECK(socks_params_.get() == NULL);
5521ae586050b3022a662bfe7743553d462ae4ced8Kristian Monsen      ignore_limits_ = http_proxy_params_->ignore_limits();
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case ProxyServer::SCHEME_SOCKS4:
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case ProxyServer::SCHEME_SOCKS5:
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DCHECK(transport_params_.get() == NULL);
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      DCHECK(http_proxy_params_.get() == NULL);
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      DCHECK(socks_params_.get() != NULL);
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ignore_limits_ = socks_params_->ignore_limits();
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      LOG(DFATAL) << "unknown proxy type";
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSSLSocketParams::~SSLSocketParams() {}
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
72e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma#ifdef ANDROID
73e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharmabool SSLSocketParams::getUID(uid_t *uid) const {
74e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma  bool answer = false;
75e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma  switch (proxy_) {
76e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma    case ProxyServer::SCHEME_DIRECT:
77d65f8a80bfb27f6e91bce31ecca8e5d010d50d34Ashish Sharma      DCHECK(transport_params_.get() != NULL);
78d65f8a80bfb27f6e91bce31ecca8e5d010d50d34Ashish Sharma      DCHECK(http_proxy_params_.get() == NULL);
79d65f8a80bfb27f6e91bce31ecca8e5d010d50d34Ashish Sharma      DCHECK(socks_params_.get() == NULL);
80d65f8a80bfb27f6e91bce31ecca8e5d010d50d34Ashish Sharma      answer = transport_params_->getUID(uid);
81e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma      break;
82e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma    case ProxyServer::SCHEME_HTTP:
83e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma    case ProxyServer::SCHEME_HTTPS:
84d65f8a80bfb27f6e91bce31ecca8e5d010d50d34Ashish Sharma      DCHECK(transport_params_.get() == NULL);
85d65f8a80bfb27f6e91bce31ecca8e5d010d50d34Ashish Sharma      DCHECK(http_proxy_params_.get() != NULL);
86d65f8a80bfb27f6e91bce31ecca8e5d010d50d34Ashish Sharma      DCHECK(socks_params_.get() == NULL);
87e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma      answer = http_proxy_params_->getUID(uid);
88e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma      break;
89e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma    case ProxyServer::SCHEME_SOCKS4:
90e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma    case ProxyServer::SCHEME_SOCKS5:
91d65f8a80bfb27f6e91bce31ecca8e5d010d50d34Ashish Sharma      DCHECK(transport_params_.get() == NULL);
92d65f8a80bfb27f6e91bce31ecca8e5d010d50d34Ashish Sharma      DCHECK(http_proxy_params_.get() == NULL);
93d65f8a80bfb27f6e91bce31ecca8e5d010d50d34Ashish Sharma      DCHECK(socks_params_.get() != NULL);
94e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma      answer = socks_params_->getUID(uid);
95e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma      break;
96e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma    default:
97e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma      break;
98e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma  }
99e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma  return answer;
100e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma}
101e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma
102e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharmavoid SSLSocketParams::setUID(uid_t uid) {
103e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma  switch (proxy_) {
104e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma    case ProxyServer::SCHEME_DIRECT:
105e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma      break;
106e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma    case ProxyServer::SCHEME_HTTP:
107e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma    case ProxyServer::SCHEME_HTTPS:
108e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma      http_proxy_params_->setUID(uid);
109e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma      break;
110e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma    case ProxyServer::SCHEME_SOCKS4:
111e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma    case ProxyServer::SCHEME_SOCKS5:
112e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma      socks_params_->setUID(uid);
113e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma      break;
114e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma    default:
115e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma      break;
116e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma  }
117e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma}
118e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma#endif
119e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Timeout for the SSL handshake portion of the connect.
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const int kSSLHandshakeTimeoutInSeconds = 30;
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSSLConnectJob::SSLConnectJob(
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string& group_name,
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const scoped_refptr<SSLSocketParams>& params,
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const base::TimeDelta& timeout_duration,
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    TransportClientSocketPool* transport_pool,
1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    SOCKSClientSocketPool* socks_pool,
1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    HttpProxyClientSocketPool* http_proxy_pool,
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ClientSocketFactory* client_socket_factory,
131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    HostResolver* host_resolver,
13221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    CertVerifier* cert_verifier,
133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DnsRRResolver* dnsrr_resolver,
134201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    DnsCertProvenanceChecker* dns_cert_checker,
135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    SSLHostInfoFactory* ssl_host_info_factory,
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Delegate* delegate,
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NetLog* net_log)
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : ConnectJob(group_name, timeout_duration, delegate,
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)),
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      params_(params),
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      transport_pool_(transport_pool),
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      socks_pool_(socks_pool),
1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      http_proxy_pool_(http_proxy_pool),
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      client_socket_factory_(client_socket_factory),
14521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      host_resolver_(host_resolver),
14621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      cert_verifier_(cert_verifier),
147731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      dnsrr_resolver_(dnsrr_resolver),
148201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      dns_cert_checker_(dns_cert_checker),
149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      ssl_host_info_factory_(ssl_host_info_factory),
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ALLOW_THIS_IN_INITIALIZER_LIST(
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          callback_(this, &SSLConnectJob::OnIOComplete)) {}
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSSLConnectJob::~SSLConnectJob() {}
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochLoadState SSLConnectJob::GetLoadState() const {
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (next_state_) {
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case STATE_TUNNEL_CONNECT_COMPLETE:
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (transport_socket_handle_->socket())
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        return LOAD_STATE_ESTABLISHING_PROXY_TUNNEL;
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // else, fall through.
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case STATE_TRANSPORT_CONNECT:
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case STATE_TRANSPORT_CONNECT_COMPLETE:
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case STATE_SOCKS_CONNECT:
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case STATE_SOCKS_CONNECT_COMPLETE:
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case STATE_TUNNEL_CONNECT:
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return transport_socket_handle_->GetLoadState();
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case STATE_SSL_CONNECT:
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case STATE_SSL_CONNECT_COMPLETE:
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return LOAD_STATE_SSL_HANDSHAKE;
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED();
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return LOAD_STATE_IDLE;
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid SSLConnectJob::GetAdditionalErrorState(ClientSocketHandle * handle) {
17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Headers in |error_response_info_| indicate a proxy tunnel setup
17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // problem. See DoTunnelConnectComplete.
17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (error_response_info_.headers) {
18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    handle->set_pending_http_proxy_connection(
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        transport_socket_handle_.release());
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  handle->set_ssl_error_response_info(error_response_info_);
18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!ssl_connect_start_time_.is_null())
18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    handle->set_is_ssl_error(true);
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SSLConnectJob::OnIOComplete(int result) {
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int rv = DoLoop(result);
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (rv != ERR_IO_PENDING)
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NotifyDelegateOfCompletion(rv);  // Deletes |this|.
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint SSLConnectJob::DoLoop(int result) {
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK_NE(next_state_, STATE_NONE);
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int rv = result;
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  do {
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    State state = next_state_;
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    next_state_ = STATE_NONE;
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    switch (state) {
202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      case STATE_TRANSPORT_CONNECT:
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        DCHECK_EQ(OK, rv);
204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        rv = DoTransportConnect();
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        break;
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      case STATE_TRANSPORT_CONNECT_COMPLETE:
207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        rv = DoTransportConnectComplete(rv);
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        break;
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      case STATE_SOCKS_CONNECT:
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        DCHECK_EQ(OK, rv);
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        rv = DoSOCKSConnect();
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        break;
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      case STATE_SOCKS_CONNECT_COMPLETE:
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        rv = DoSOCKSConnectComplete(rv);
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        break;
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      case STATE_TUNNEL_CONNECT:
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        DCHECK_EQ(OK, rv);
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        rv = DoTunnelConnect();
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        break;
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      case STATE_TUNNEL_CONNECT_COMPLETE:
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        rv = DoTunnelConnectComplete(rv);
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        break;
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      case STATE_SSL_CONNECT:
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        DCHECK_EQ(OK, rv);
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        rv = DoSSLConnect();
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        break;
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      case STATE_SSL_CONNECT_COMPLETE:
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        rv = DoSSLConnectComplete(rv);
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        break;
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      default:
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        NOTREACHED() << "bad state";
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        rv = ERR_FAILED;
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        break;
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE);
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return rv;
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenint SSLConnectJob::DoTransportConnect() {
241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(transport_pool_);
2423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
24321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (ssl_host_info_factory_) {
244731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      ssl_host_info_.reset(
2454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          ssl_host_info_factory_->GetForHost(params_->host_and_port().host(),
246513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                             params_->ssl_config()));
247731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
2483f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
249731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (ssl_host_info_.get()) {
25072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (dnsrr_resolver_)
25172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ssl_host_info_->StartDnsLookup(dnsrr_resolver_);
25272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // This starts fetching the SSL host info from the disk cache for Snap
254731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Start.
255731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    ssl_host_info_->Start();
256731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
2573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  next_state_ = STATE_TRANSPORT_CONNECT_COMPLETE;
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  transport_socket_handle_.reset(new ClientSocketHandle());
260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<TransportSocketParams> transport_params =
261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      params_->transport_params();
262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return transport_socket_handle_->Init(
263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      group_name(),
264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      transport_params,
265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      transport_params->destination().priority(),
266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      &callback_, transport_pool_, net_log());
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenint SSLConnectJob::DoTransportConnectComplete(int result) {
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (result == OK)
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    next_state_ = STATE_SSL_CONNECT;
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return result;
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint SSLConnectJob::DoSOCKSConnect() {
2773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DCHECK(socks_pool_);
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  next_state_ = STATE_SOCKS_CONNECT_COMPLETE;
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  transport_socket_handle_.reset(new ClientSocketHandle());
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<SOCKSSocketParams> socks_params = params_->socks_params();
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return transport_socket_handle_->Init(group_name(), socks_params,
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        socks_params->destination().priority(),
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        &callback_, socks_pool_, net_log());
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint SSLConnectJob::DoSOCKSConnectComplete(int result) {
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (result == OK)
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    next_state_ = STATE_SSL_CONNECT;
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return result;
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint SSLConnectJob::DoTunnelConnect() {
2943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DCHECK(http_proxy_pool_);
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  next_state_ = STATE_TUNNEL_CONNECT_COMPLETE;
2963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  transport_socket_handle_.reset(new ClientSocketHandle());
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<HttpProxySocketParams> http_proxy_params =
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      params_->http_proxy_params();
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return transport_socket_handle_->Init(
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      group_name(), http_proxy_params,
3023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      http_proxy_params->destination().priority(), &callback_,
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      http_proxy_pool_, net_log());
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint SSLConnectJob::DoTunnelConnectComplete(int result) {
3074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Extract the information needed to prompt for appropriate proxy
3084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // authentication so that when ClientSocketPoolBaseHelper calls
3094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // |GetAdditionalErrorState|, we can easily set the state.
3104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) {
3114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    error_response_info_ = transport_socket_handle_->ssl_error_response_info();
31221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  } else if (result == ERR_PROXY_AUTH_REQUESTED ||
31321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen             result == ERR_HTTPS_PROXY_TUNNEL_RESPONSE) {
3144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    ClientSocket* socket = transport_socket_handle_->socket();
3154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    HttpProxyClientSocket* tunnel_socket =
3164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        static_cast<HttpProxyClientSocket*>(socket);
31721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    error_response_info_ = *tunnel_socket->GetConnectResponseInfo();
3184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (result < 0)
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return result;
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  next_state_ = STATE_SSL_CONNECT;
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return result;
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint SSLConnectJob::DoSSLConnect() {
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  next_state_ = STATE_SSL_CONNECT_COMPLETE;
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Reset the timeout to just the time allowed for the SSL handshake.
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ResetTimer(base::TimeDelta::FromSeconds(kSSLHandshakeTimeoutInSeconds));
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ssl_connect_start_time_ = base::TimeTicks::Now();
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ssl_socket_.reset(client_socket_factory_->CreateSSLClientSocket(
3334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      transport_socket_handle_.release(), params_->host_and_port(),
3346b98c7e015d80649e4d7ee11ac3e4ef7f65da9d2Kristian Monsen      params_->ssl_config(), ssl_host_info_.release(), cert_verifier_,
3356b98c7e015d80649e4d7ee11ac3e4ef7f65da9d2Kristian Monsen      dns_cert_checker_));
336e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma
337e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma#ifdef ANDROID
338e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma  uid_t calling_uid = 0;
339d65f8a80bfb27f6e91bce31ecca8e5d010d50d34Ashish Sharma  bool valid_uid = params_->getUID(&calling_uid);
340e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma#endif
341e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma
3427b9ca917061470268bf3395c8925d4b9cc52d8e1Kristian Monsen  return ssl_socket_->Connect(&callback_
3437b9ca917061470268bf3395c8925d4b9cc52d8e1Kristian Monsen#ifdef ANDROID
3447b9ca917061470268bf3395c8925d4b9cc52d8e1Kristian Monsen                              , params_->ignore_limits()
345e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma                              , valid_uid
346e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma                              , calling_uid
3477b9ca917061470268bf3395c8925d4b9cc52d8e1Kristian Monsen#endif
3487b9ca917061470268bf3395c8925d4b9cc52d8e1Kristian Monsen                             );
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint SSLConnectJob::DoSSLConnectComplete(int result) {
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SSLClientSocket::NextProtoStatus status =
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SSLClientSocket::kNextProtoUnsupported;
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string proto;
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // GetNextProto will fail and and trigger a NOTREACHED if we pass in a socket
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // that hasn't had SSL_ImportFD called on it. If we get a certificate error
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // here, then we know that we called SSL_ImportFD.
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (result == OK || IsCertificateError(result))
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    status = ssl_socket_->GetNextProto(&proto);
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // If we want spdy over npn, make sure it succeeded.
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (status == SSLClientSocket::kNextProtoNegotiated) {
3633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ssl_socket_->set_was_npn_negotiated(true);
3643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    SSLClientSocket::NextProto next_protocol =
3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        SSLClientSocket::NextProtoFromString(proto);
3663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // If we negotiated either version of SPDY, we must have
3673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // advertised it, so allow it.
3683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // TODO(mbelshe): verify it was a protocol we advertised?
3693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (next_protocol == SSLClientSocket::kProtoSPDY1 ||
3703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        next_protocol == SSLClientSocket::kProtoSPDY2) {
3713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      ssl_socket_->set_was_spdy_negotiated(true);
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
3743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (params_->want_spdy_over_npn() && !ssl_socket_->was_spdy_negotiated())
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return ERR_NPN_NEGOTIATION_FAILED;
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Spdy might be turned on by default, or it might be over npn.
3783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool using_spdy = params_->force_spdy_over_ssl() ||
3793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      params_->want_spdy_over_npn();
3803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (result == OK ||
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ssl_socket_->IgnoreCertError(result, params_->load_flags())) {
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DCHECK(ssl_connect_start_time_ != base::TimeTicks());
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    base::TimeDelta connect_duration =
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        base::TimeTicks::Now() - ssl_connect_start_time_;
386731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (using_spdy) {
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      UMA_HISTOGRAM_CUSTOM_TIMES("Net.SpdyConnectionLatency",
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 connect_duration,
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 base::TimeDelta::FromMilliseconds(1),
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 base::TimeDelta::FromMinutes(10),
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 100);
392731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    } else {
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      UMA_HISTOGRAM_CUSTOM_TIMES("Net.SSL_Connection_Latency",
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 connect_duration,
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 base::TimeDelta::FromMilliseconds(1),
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 base::TimeDelta::FromMinutes(10),
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 100);
398dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
399ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& host = params_->host_and_port().host();
400ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      bool is_google = host == "google.com" ||
401ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       host.rfind(".google.com") == host.size() - 11;
402ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (is_google) {
403ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        UMA_HISTOGRAM_CUSTOM_TIMES("Net.SSL_Connection_Latency_Google",
404ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   connect_duration,
405ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   base::TimeDelta::FromMilliseconds(1),
406ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   base::TimeDelta::FromMinutes(10),
407ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   100);
408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
410dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      static bool false_start_trial(
411dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          base::FieldTrialList::Find("SSLFalseStart") &&
412dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          !base::FieldTrialList::Find("SSLFalseStart")->group_name().empty());
413dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (false_start_trial) {
414dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        UMA_HISTOGRAM_CUSTOM_TIMES(base::FieldTrial::MakeName(
415dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                       "Net.SSL_Connection_Latency",
416dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                       "SSLFalseStart"),
417dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   connect_duration,
418dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   base::TimeDelta::FromMilliseconds(1),
419dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   base::TimeDelta::FromMinutes(10),
420dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   100);
421dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
422731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (result == OK || IsCertificateError(result)) {
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    set_socket(ssl_socket_.release());
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) {
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    error_response_info_.cert_request_info = new SSLCertRequestInfo;
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ssl_socket_->GetSSLCertRequestInfo(error_response_info_.cert_request_info);
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return result;
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenint SSLConnectJob::ConnectInternal() {
43672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  switch (params_->proxy()) {
43772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case ProxyServer::SCHEME_DIRECT:
438ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      next_state_ = STATE_TRANSPORT_CONNECT;
43972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
44072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case ProxyServer::SCHEME_HTTP:
44172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case ProxyServer::SCHEME_HTTPS:
44272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      next_state_ = STATE_TUNNEL_CONNECT;
44372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
44472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case ProxyServer::SCHEME_SOCKS4:
44572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case ProxyServer::SCHEME_SOCKS5:
44672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      next_state_ = STATE_SOCKS_CONNECT;
44772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
44872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    default:
44972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      NOTREACHED() << "unknown proxy type";
45072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
45172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
45272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return DoLoop(OK);
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSSLClientSocketPool::SSLConnectJobFactory::SSLConnectJobFactory(
456ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    TransportClientSocketPool* transport_pool,
4573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    SOCKSClientSocketPool* socks_pool,
4583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    HttpProxyClientSocketPool* http_proxy_pool,
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ClientSocketFactory* client_socket_factory,
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    HostResolver* host_resolver,
46121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    CertVerifier* cert_verifier,
462731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DnsRRResolver* dnsrr_resolver,
463201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    DnsCertProvenanceChecker* dns_cert_checker,
464731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    SSLHostInfoFactory* ssl_host_info_factory,
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NetLog* net_log)
466ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : transport_pool_(transport_pool),
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      socks_pool_(socks_pool),
4683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      http_proxy_pool_(http_proxy_pool),
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      client_socket_factory_(client_socket_factory),
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      host_resolver_(host_resolver),
47121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      cert_verifier_(cert_verifier),
472731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      dnsrr_resolver_(dnsrr_resolver),
473201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      dns_cert_checker_(dns_cert_checker),
474731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      ssl_host_info_factory_(ssl_host_info_factory),
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      net_log_(net_log) {
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::TimeDelta max_transport_timeout = base::TimeDelta();
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::TimeDelta pool_timeout;
478ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (transport_pool_)
479ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    max_transport_timeout = transport_pool_->ConnectionTimeout();
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (socks_pool_) {
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    pool_timeout = socks_pool_->ConnectionTimeout();
482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (pool_timeout > max_transport_timeout)
483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      max_transport_timeout = pool_timeout;
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (http_proxy_pool_) {
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    pool_timeout = http_proxy_pool_->ConnectionTimeout();
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (pool_timeout > max_transport_timeout)
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      max_transport_timeout = pool_timeout;
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  timeout_ = max_transport_timeout +
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      base::TimeDelta::FromSeconds(kSSLHandshakeTimeoutInSeconds);
492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
494c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSSLClientSocketPool::SSLClientSocketPool(
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int max_sockets,
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int max_sockets_per_group,
4973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ClientSocketPoolHistograms* histograms,
498731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    HostResolver* host_resolver,
49921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    CertVerifier* cert_verifier,
500731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DnsRRResolver* dnsrr_resolver,
501201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    DnsCertProvenanceChecker* dns_cert_checker,
502731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    SSLHostInfoFactory* ssl_host_info_factory,
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ClientSocketFactory* client_socket_factory,
504ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    TransportClientSocketPool* transport_pool,
5053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    SOCKSClientSocketPool* socks_pool,
5063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    HttpProxyClientSocketPool* http_proxy_pool,
5073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    SSLConfigService* ssl_config_service,
508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NetLog* net_log)
509ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : transport_pool_(transport_pool),
5103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      socks_pool_(socks_pool),
5113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      http_proxy_pool_(http_proxy_pool),
5123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      base_(max_sockets, max_sockets_per_group, histograms,
513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            base::TimeDelta::FromSeconds(
514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                ClientSocketPool::unused_idle_socket_timeout()),
515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            base::TimeDelta::FromSeconds(kUsedIdleSocketTimeout),
516ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            new SSLConnectJobFactory(transport_pool,
517ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     socks_pool,
518ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     http_proxy_pool,
519ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     client_socket_factory,
520ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     host_resolver,
521ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     cert_verifier,
522ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     dnsrr_resolver,
523ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     dns_cert_checker,
524ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     ssl_host_info_factory,
5253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                     net_log)),
5263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      ssl_config_service_(ssl_config_service) {
5273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (ssl_config_service_)
5283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ssl_config_service_->AddObserver(this);
5293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5313345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickSSLClientSocketPool::~SSLClientSocketPool() {
5323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (ssl_config_service_)
5333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ssl_config_service_->RemoveObserver(this);
5343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenConnectJob* SSLClientSocketPool::SSLConnectJobFactory::NewConnectJob(
53772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const std::string& group_name,
53872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const PoolBase::Request& request,
53972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ConnectJob::Delegate* delegate) const {
54072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return new SSLConnectJob(group_name, request.params(), ConnectionTimeout(),
541ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           transport_pool_, socks_pool_, http_proxy_pool_,
54272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                           client_socket_factory_, host_resolver_,
54372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                           cert_verifier_, dnsrr_resolver_, dns_cert_checker_,
54472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                           ssl_host_info_factory_, delegate, net_log_);
54572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
54672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint SSLClientSocketPool::RequestSocket(const std::string& group_name,
548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       const void* socket_params,
549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       RequestPriority priority,
550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       ClientSocketHandle* handle,
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       CompletionCallback* callback,
552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       const BoundNetLog& net_log) {
553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const scoped_refptr<SSLSocketParams>* casted_socket_params =
554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      static_cast<const scoped_refptr<SSLSocketParams>*>(socket_params);
555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return base_.RequestSocket(group_name, *casted_socket_params, priority,
557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             handle, callback, net_log);
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
560731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid SSLClientSocketPool::RequestSockets(
561731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const std::string& group_name,
562731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const void* params,
563731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    int num_sockets,
564731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const BoundNetLog& net_log) {
565731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  const scoped_refptr<SSLSocketParams>* casted_params =
566731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      static_cast<const scoped_refptr<SSLSocketParams>*>(params);
567731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
568731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  base_.RequestSockets(group_name, *casted_params, num_sockets, net_log);
569731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
570731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SSLClientSocketPool::CancelRequest(const std::string& group_name,
572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        ClientSocketHandle* handle) {
573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base_.CancelRequest(group_name, handle);
574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SSLClientSocketPool::ReleaseSocket(const std::string& group_name,
577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        ClientSocket* socket, int id) {
578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base_.ReleaseSocket(group_name, socket, id);
579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SSLClientSocketPool::Flush() {
582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base_.Flush();
583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SSLClientSocketPool::CloseIdleSockets() {
586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base_.CloseIdleSockets();
587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenint SSLClientSocketPool::IdleSocketCount() const {
59021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return base_.idle_socket_count();
59121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
59221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint SSLClientSocketPool::IdleSocketCountInGroup(
594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string& group_name) const {
595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return base_.IdleSocketCountInGroup(group_name);
596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
598c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochLoadState SSLClientSocketPool::GetLoadState(
599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string& group_name, const ClientSocketHandle* handle) const {
600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return base_.GetLoadState(group_name, handle);
601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6033345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickDictionaryValue* SSLClientSocketPool::GetInfoAsValue(
6043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const std::string& name,
6053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const std::string& type,
6063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool include_nested_pools) const {
6073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DictionaryValue* dict = base_.GetInfoAsValue(name, type);
6083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (include_nested_pools) {
6093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ListValue* list = new ListValue();
610ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (transport_pool_) {
611ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      list->Append(transport_pool_->GetInfoAsValue("transport_socket_pool",
612ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                   "transport_socket_pool",
613ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                   false));
6143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
6153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (socks_pool_) {
6163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      list->Append(socks_pool_->GetInfoAsValue("socks_pool",
6173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                               "socks_pool",
6183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                               true));
6193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
6203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (http_proxy_pool_) {
6213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      list->Append(http_proxy_pool_->GetInfoAsValue("http_proxy_pool",
6223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                                    "http_proxy_pool",
6233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                                    true));
6243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
6253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    dict->Set("nested_pools", list);
6263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
6273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return dict;
6283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
6293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
63021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbase::TimeDelta SSLClientSocketPool::ConnectionTimeout() const {
63121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return base_.ConnectionTimeout();
63221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
63321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
63421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenClientSocketPoolHistograms* SSLClientSocketPool::histograms() const {
63521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return base_.histograms();
63621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
63721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
63872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid SSLClientSocketPool::OnSSLConfigChanged() {
63972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  Flush();
64072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
64172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace net
643