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