15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_HTTP_HTTP_PROXY_CLIENT_SOCKET_POOL_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_HTTP_HTTP_PROXY_CLIENT_SOCKET_POOL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/host_port_pair.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_export.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_auth.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_info.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/proxy_client_socket.h"
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/socket/client_socket_pool.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/client_socket_pool_base.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/client_socket_pool_histograms.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/ssl_client_socket.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/spdy/spdy_session.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HostResolver;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpAuthCache;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpAuthHandlerFactory;
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ProxyDelegate;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLClientSocketPool;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLSocketParams;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SpdySessionPool;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SpdyStream;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TransportClientSocketPool;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TransportSocketParams;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HttpProxySocketParams only needs the socket params for one of the proxy
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// types.  The other param must be NULL.  When using an HTTP Proxy,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |transport_params| must be set.  When using an HTTPS Proxy, |ssl_params|
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// must be set.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE HttpProxySocketParams
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public base::RefCounted<HttpProxySocketParams> {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpProxySocketParams(
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const scoped_refptr<TransportSocketParams>& transport_params,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const scoped_refptr<SSLSocketParams>& ssl_params,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& request_url,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& user_agent,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const HostPortPair& endpoint,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthCache* http_auth_cache,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerFactory* http_auth_handler_factory,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SpdySessionPool* spdy_session_pool,
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bool tunnel,
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ProxyDelegate* proxy_delegate);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const scoped_refptr<TransportSocketParams>& transport_params() const {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return transport_params_;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const scoped_refptr<SSLSocketParams>& ssl_params() const {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ssl_params_;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& request_url() const { return request_url_; }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& user_agent() const { return user_agent_; }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HostPortPair& endpoint() const { return endpoint_; }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpAuthCache* http_auth_cache() const { return http_auth_cache_; }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpAuthHandlerFactory* http_auth_handler_factory() const {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return http_auth_handler_factory_;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SpdySessionPool* spdy_session_pool() {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return spdy_session_pool_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HostResolver::RequestInfo& destination() const;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool tunnel() const { return tunnel_; }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ignore_limits() const { return ignore_limits_; }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ProxyDelegate* proxy_delegate() const {
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return proxy_delegate_;
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCounted<HttpProxySocketParams>;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~HttpProxySocketParams();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const scoped_refptr<TransportSocketParams> transport_params_;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const scoped_refptr<SSLSocketParams> ssl_params_;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SpdySessionPool* spdy_session_pool_;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL request_url_;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string user_agent_;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HostPortPair endpoint_;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpAuthCache* const http_auth_cache_;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpAuthHandlerFactory* const http_auth_handler_factory_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool tunnel_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ignore_limits_;
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ProxyDelegate* proxy_delegate_;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(HttpProxySocketParams);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HttpProxyConnectJob optionally establishes a tunnel through the proxy
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// server after connecting the underlying transport socket.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpProxyConnectJob : public ConnectJob {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpProxyConnectJob(const std::string& group_name,
1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                      RequestPriority priority,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const scoped_refptr<HttpProxySocketParams>& params,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const base::TimeDelta& timeout_duration,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      TransportClientSocketPool* transport_pool,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      SSLClientSocketPool* ssl_pool,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      HostResolver* host_resolver,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      Delegate* delegate,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      NetLog* net_log);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~HttpProxyConnectJob();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ConnectJob methods.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual LoadState GetLoadState() const OVERRIDE;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetAdditionalErrorState(ClientSocketHandle* handle) OVERRIDE;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum State {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_TCP_CONNECT,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_TCP_CONNECT_COMPLETE,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_SSL_CONNECT,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_SSL_CONNECT_COMPLETE,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_HTTP_PROXY_CONNECT,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_HTTP_PROXY_CONNECT_COMPLETE,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_SPDY_PROXY_CREATE_STREAM,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_SPDY_PROXY_CREATE_STREAM_COMPLETE,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_SPDY_PROXY_CONNECT_COMPLETE,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_NONE,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnIOComplete(int result);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs the state transition loop.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int DoLoop(int result);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Connecting to HTTP Proxy
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int DoTransportConnect();
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int DoTransportConnectComplete(int result);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Connecting to HTTPS Proxy
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int DoSSLConnect();
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int DoSSLConnectComplete(int result);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int DoHttpProxyConnect();
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int DoHttpProxyConnectComplete(int result);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int DoSpdyProxyCreateStream();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int DoSpdyProxyCreateStreamComplete(int result);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Begins the tcp connection and the optional Http proxy tunnel.  If the
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // request is not immediately servicable (likely), the request will return
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ERR_IO_PENDING. An OK return from this function or the callback means
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that the connection is established; ERR_PROXY_AUTH_REQUESTED means
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that the tunnel needs authentication credentials, the socket will be
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // returned in this case, and must be release back to the pool; or
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a standard net error code will be returned.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int ConnectInternal() OVERRIDE;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<HttpProxySocketParams> params_;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportClientSocketPool* const transport_pool_;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLClientSocketPool* const ssl_pool_;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostResolver* const resolver_;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  State next_state_;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompletionCallback callback_;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ClientSocketHandle> transport_socket_handle_;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ProxyClientSocket> transport_socket_;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool using_spdy_;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Protocol negotiated with the server.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NextProto protocol_negotiated_;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpResponseInfo error_response_info_;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpdyStreamRequest spdy_stream_request_;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::WeakPtrFactory<HttpProxyConnectJob> weak_ptr_factory_;
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(HttpProxyConnectJob);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE HttpProxyClientSocketPool
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public ClientSocketPool,
1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      public HigherLayeredPool {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  typedef HttpProxySocketParams SocketParams;
1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpProxyClientSocketPool(
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int max_sockets,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int max_sockets_per_group,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ClientSocketPoolHistograms* histograms,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HostResolver* host_resolver,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TransportClientSocketPool* transport_pool,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SSLClientSocketPool* ssl_pool,
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const ProxyDelegate* proxy_delegate,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NetLog* net_log);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~HttpProxyClientSocketPool();
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ClientSocketPool implementation.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int RequestSocket(const std::string& group_name,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const void* connect_params,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            RequestPriority priority,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            ClientSocketHandle* handle,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const CompletionCallback& callback,
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const BoundNetLog& net_log) OVERRIDE;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RequestSockets(const std::string& group_name,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const void* params,
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int num_sockets,
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const BoundNetLog& net_log) OVERRIDE;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CancelRequest(const std::string& group_name,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ClientSocketHandle* handle) OVERRIDE;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ReleaseSocket(const std::string& group_name,
2193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                             scoped_ptr<StreamSocket> socket,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             int id) OVERRIDE;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void FlushWithError(int error) OVERRIDE;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CloseIdleSockets() OVERRIDE;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int IdleSocketCount() const OVERRIDE;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int IdleSocketCountInGroup(
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& group_name) const OVERRIDE;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual LoadState GetLoadState(
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& group_name,
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ClientSocketHandle* handle) const OVERRIDE;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual base::DictionaryValue* GetInfoAsValue(
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& name,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& type,
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool include_nested_pools) const OVERRIDE;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual base::TimeDelta ConnectionTimeout() const OVERRIDE;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ClientSocketPoolHistograms* histograms() const OVERRIDE;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // LowerLayeredPool implementation.
2453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual bool IsStalled() const OVERRIDE;
2463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void AddHigherLayeredPool(HigherLayeredPool* higher_pool) OVERRIDE;
2483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) OVERRIDE;
2503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // HigherLayeredPool implementation.
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool CloseOneIdleConnection() OVERRIDE;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef ClientSocketPoolBase<HttpProxySocketParams> PoolBase;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class HttpProxyConnectJobFactory : public PoolBase::ConnectJobFactory {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpProxyConnectJobFactory(
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TransportClientSocketPool* transport_pool,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SSLClientSocketPool* ssl_pool,
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        HostResolver* host_resolver,
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        const ProxyDelegate* proxy_delegate,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NetLog* net_log);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ClientSocketPoolBase::ConnectJobFactory methods.
2673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    virtual scoped_ptr<ConnectJob> NewConnectJob(
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const std::string& group_name,
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const PoolBase::Request& request,
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ConnectJob::Delegate* delegate) const OVERRIDE;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual base::TimeDelta ConnectionTimeout() const OVERRIDE;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TransportClientSocketPool* const transport_pool_;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SSLClientSocketPool* const ssl_pool_;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HostResolver* const host_resolver_;
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ProxyDelegate* proxy_delegate_;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NetLog* net_log_;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeDelta timeout_;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(HttpProxyConnectJobFactory);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportClientSocketPool* const transport_pool_;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLClientSocketPool* const ssl_pool_;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PoolBase base_;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(HttpProxyClientSocketPool);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_HTTP_HTTP_PROXY_CLIENT_SOCKET_POOL_H_
295