http_proxy_client_socket_pool.cc revision c407dc5cd9bdc5668497f21b26b09d988ab439de
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 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/http/http_proxy_client_socket_pool.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_errors.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/http/http_proxy_client_socket.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/socket/client_socket_factory.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/socket/client_socket_handle.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/socket/client_socket_pool_base.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace net { 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochHttpProxySocketParams::HttpProxySocketParams( 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const scoped_refptr<TCPSocketParams>& proxy_server, 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& request_url, 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HostPortPair endpoint, 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<HttpAuthController> auth_controller, 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool tunnel) 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : tcp_params_(proxy_server), 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request_url_(request_url), 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch endpoint_(endpoint), 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch auth_controller_(auth_controller), 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tunnel_(tunnel) { 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochHttpProxySocketParams::~HttpProxySocketParams() {} 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HttpProxyConnectJobs will time out after this many seconds. Note this is on 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// top of the timeout for the transport socket. 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const int kHttpProxyConnectJobTimeoutInSeconds = 30; 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochHttpProxyConnectJob::HttpProxyConnectJob( 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& group_name, 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const scoped_refptr<HttpProxySocketParams>& params, 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const base::TimeDelta& timeout_duration, 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const scoped_refptr<TCPClientSocketPool>& tcp_pool, 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const scoped_refptr<HostResolver>& host_resolver, 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Delegate* delegate, 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NetLog* net_log) 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : ConnectJob(group_name, timeout_duration, delegate, 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)), 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch params_(params), 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tcp_pool_(tcp_pool), 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch resolver_(host_resolver), 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ALLOW_THIS_IN_INITIALIZER_LIST( 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch callback_(this, &HttpProxyConnectJob::OnIOComplete)) { 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochHttpProxyConnectJob::~HttpProxyConnectJob() {} 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochLoadState HttpProxyConnectJob::GetLoadState() const { 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (next_state_) { 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case kStateTCPConnect: 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case kStateTCPConnectComplete: 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return tcp_socket_handle_->GetLoadState(); 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case kStateHttpProxyConnect: 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case kStateHttpProxyConnectComplete: 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return LOAD_STATE_ESTABLISHING_PROXY_TUNNEL; 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default: 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return LOAD_STATE_IDLE; 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint HttpProxyConnectJob::ConnectInternal() { 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_state_ = kStateTCPConnect; 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return DoLoop(OK); 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid HttpProxyConnectJob::OnIOComplete(int result) { 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int rv = DoLoop(result); 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (rv != ERR_IO_PENDING) 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotifyDelegateOfCompletion(rv); // Deletes |this| 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint HttpProxyConnectJob::DoLoop(int result) { 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK_NE(next_state_, kStateNone); 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int rv = result; 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch do { 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch State state = next_state_; 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_state_ = kStateNone; 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (state) { 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case kStateTCPConnect: 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK_EQ(OK, rv); 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = DoTCPConnect(); 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case kStateTCPConnectComplete: 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = DoTCPConnectComplete(rv); 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case kStateHttpProxyConnect: 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK_EQ(OK, rv); 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = DoHttpProxyConnect(); 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case kStateHttpProxyConnectComplete: 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = DoHttpProxyConnectComplete(rv); 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default: 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED() << "bad state"; 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = ERR_FAILED; 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } while (rv != ERR_IO_PENDING && next_state_ != kStateNone); 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return rv; 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint HttpProxyConnectJob::DoTCPConnect() { 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_state_ = kStateTCPConnectComplete; 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tcp_socket_handle_.reset(new ClientSocketHandle()); 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return tcp_socket_handle_->Init( 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch group_name(), params_->tcp_params(), 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch params_->tcp_params()->destination().priority(), &callback_, tcp_pool_, 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net_log()); 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint HttpProxyConnectJob::DoTCPConnectComplete(int result) { 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (result != OK) 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return result; 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Reset the timer to just the length of time allowed for HttpProxy handshake 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // so that a fast TCP connection plus a slow HttpProxy failure doesn't take 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // longer to timeout than it should. 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ResetTimer(base::TimeDelta::FromSeconds( 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kHttpProxyConnectJobTimeoutInSeconds)); 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_state_ = kStateHttpProxyConnect; 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return result; 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint HttpProxyConnectJob::DoHttpProxyConnect() { 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_state_ = kStateHttpProxyConnectComplete; 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Add a HttpProxy connection on top of the tcp socket. 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_.reset(new HttpProxyClientSocket(tcp_socket_handle_.release(), 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch params_->request_url(), 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch params_->endpoint(), 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch params_->auth_controller(), 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch params_->tunnel())); 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return socket_->Connect(&callback_); 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint HttpProxyConnectJob::DoHttpProxyConnectComplete(int result) { 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK_NE(result, ERR_RETRY_CONNECTION); 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (result == OK || result == ERR_PROXY_AUTH_REQUESTED) 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch set_socket(socket_.release()); 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return result; 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochConnectJob* 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochHttpProxyClientSocketPool::HttpProxyConnectJobFactory::NewConnectJob( 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& group_name, 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const PoolBase::Request& request, 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ConnectJob::Delegate* delegate) const { 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return new HttpProxyConnectJob(group_name, request.params(), 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ConnectionTimeout(), tcp_pool_, host_resolver_, 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delegate, net_log_); 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbase::TimeDelta 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochHttpProxyClientSocketPool::HttpProxyConnectJobFactory::ConnectionTimeout() 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst { 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return tcp_pool_->ConnectionTimeout() + 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::TimeDelta::FromSeconds(kHttpProxyConnectJobTimeoutInSeconds); 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochHttpProxyClientSocketPool::HttpProxyClientSocketPool( 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int max_sockets, 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int max_sockets_per_group, 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const scoped_refptr<ClientSocketPoolHistograms>& histograms, 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const scoped_refptr<HostResolver>& host_resolver, 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const scoped_refptr<TCPClientSocketPool>& tcp_pool, 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NetLog* net_log) 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : base_(max_sockets, max_sockets_per_group, histograms, 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::TimeDelta::FromSeconds( 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketPool::unused_idle_socket_timeout()), 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::TimeDelta::FromSeconds(kUsedIdleSocketTimeout), 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new HttpProxyConnectJobFactory(tcp_pool, host_resolver, net_log)) {} 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochHttpProxyClientSocketPool::~HttpProxyClientSocketPool() {} 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint HttpProxyClientSocketPool::RequestSocket(const std::string& group_name, 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const void* socket_params, 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RequestPriority priority, 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle* handle, 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CompletionCallback* callback, 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const BoundNetLog& net_log) { 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const scoped_refptr<HttpProxySocketParams>* casted_socket_params = 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<const scoped_refptr<HttpProxySocketParams>*>(socket_params); 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return base_.RequestSocket(group_name, *casted_socket_params, priority, 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch handle, callback, net_log); 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid HttpProxyClientSocketPool::CancelRequest( 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& group_name, 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle* handle) { 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base_.CancelRequest(group_name, handle); 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid HttpProxyClientSocketPool::ReleaseSocket(const std::string& group_name, 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocket* socket, int id) { 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base_.ReleaseSocket(group_name, socket, id); 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid HttpProxyClientSocketPool::Flush() { 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base_.Flush(); 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid HttpProxyClientSocketPool::CloseIdleSockets() { 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base_.CloseIdleSockets(); 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint HttpProxyClientSocketPool::IdleSocketCountInGroup( 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& group_name) const { 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return base_.IdleSocketCountInGroup(group_name); 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochLoadState HttpProxyClientSocketPool::GetLoadState( 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& group_name, const ClientSocketHandle* handle) const { 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return base_.GetLoadState(group_name, handle); 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace net 230