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