Index: net/socket/ssl_client_socket_pool.h |
diff --git a/net/socket/ssl_client_socket_pool.h b/net/socket/ssl_client_socket_pool.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cba012cc9bc6be366d1d7275ee77302845514ec1 |
--- /dev/null |
+++ b/net/socket/ssl_client_socket_pool.h |
@@ -0,0 +1,248 @@ |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef NET_SOCKET_SSL_CLIENT_SOCKET_POOL_H_ |
+#define NET_SOCKET_SSL_CLIENT_SOCKET_POOL_H_ |
+ |
+#include <string> |
+ |
+#include "base/ref_counted.h" |
+#include "base/scoped_ptr.h" |
+#include "base/time.h" |
+#include "net/base/host_resolver.h" |
+#include "net/base/ssl_config_service.h" |
+#include "net/http/http_proxy_client_socket.h" |
+#include "net/http/http_proxy_client_socket_pool.h" |
+#include "net/proxy/proxy_server.h" |
+#include "net/socket/client_socket_factory.h" |
+#include "net/socket/client_socket_pool_base.h" |
+#include "net/socket/client_socket_pool_histograms.h" |
+#include "net/socket/client_socket_pool.h" |
+#include "net/socket/socks_client_socket_pool.h" |
+#include "net/socket/ssl_client_socket.h" |
+#include "net/socket/tcp_client_socket_pool.h" |
+ |
+namespace net { |
+ |
+class ClientSocketFactory; |
+class ConnectJobFactory; |
+ |
+// SSLSocketParams only needs the socket params for the transport socket |
+// that will be used (denoted by |proxy|). |
+class SSLSocketParams : public base::RefCounted<SSLSocketParams> { |
+ public: |
+ SSLSocketParams(const scoped_refptr<TCPSocketParams>& tcp_params, |
+ const scoped_refptr<HttpProxySocketParams>& http_proxy_params, |
+ const scoped_refptr<SOCKSSocketParams>& socks_params, |
+ ProxyServer::Scheme proxy, |
+ const std::string& hostname, |
+ const SSLConfig& ssl_config, |
+ int load_flags, |
+ bool want_spdy); |
+ |
+ const scoped_refptr<TCPSocketParams>& tcp_params() { return tcp_params_; } |
+ const scoped_refptr<HttpProxySocketParams>& http_proxy_params () { |
+ return http_proxy_params_; |
+ } |
+ const scoped_refptr<SOCKSSocketParams>& socks_params() { |
+ return socks_params_; |
+ } |
+ ProxyServer::Scheme proxy() const { return proxy_; } |
+ const std::string& hostname() const { return hostname_; } |
+ const SSLConfig& ssl_config() const { return ssl_config_; } |
+ int load_flags() const { return load_flags_; } |
+ bool want_spdy() const { return want_spdy_; } |
+ |
+ private: |
+ friend class base::RefCounted<SSLSocketParams>; |
+ ~SSLSocketParams(); |
+ |
+ const scoped_refptr<TCPSocketParams> tcp_params_; |
+ const scoped_refptr<HttpProxySocketParams> http_proxy_params_; |
+ const scoped_refptr<SOCKSSocketParams> socks_params_; |
+ const ProxyServer::Scheme proxy_; |
+ const std::string hostname_; |
+ const SSLConfig ssl_config_; |
+ const int load_flags_; |
+ const bool want_spdy_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SSLSocketParams); |
+}; |
+ |
+// SSLConnectJob handles the SSL handshake after setting up the underlying |
+// connection as specified in the params. |
+class SSLConnectJob : public ConnectJob { |
+ public: |
+ SSLConnectJob( |
+ const std::string& group_name, |
+ const scoped_refptr<SSLSocketParams>& params, |
+ const base::TimeDelta& timeout_duration, |
+ const scoped_refptr<TCPClientSocketPool>& tcp_pool, |
+ const scoped_refptr<HttpProxyClientSocketPool>& http_proxy_pool, |
+ const scoped_refptr<SOCKSClientSocketPool>& socks_pool, |
+ ClientSocketFactory* client_socket_factory, |
+ const scoped_refptr<HostResolver>& host_resolver, |
+ Delegate* delegate, |
+ NetLog* net_log); |
+ virtual ~SSLConnectJob(); |
+ |
+ // ConnectJob methods. |
+ virtual LoadState GetLoadState() const; |
+ |
+ virtual void GetAdditionalErrorState(ClientSocketHandle * handle); |
+ |
+ private: |
+ enum State { |
+ STATE_TCP_CONNECT, |
+ STATE_TCP_CONNECT_COMPLETE, |
+ STATE_SOCKS_CONNECT, |
+ STATE_SOCKS_CONNECT_COMPLETE, |
+ STATE_TUNNEL_CONNECT, |
+ STATE_TUNNEL_CONNECT_COMPLETE, |
+ STATE_SSL_CONNECT, |
+ STATE_SSL_CONNECT_COMPLETE, |
+ STATE_NONE, |
+ }; |
+ |
+ // Starts the SSL connection process. Returns OK on success and |
+ // ERR_IO_PENDING if it cannot immediately service the request. |
+ // Otherwise, it returns a net error code. |
+ virtual int ConnectInternal(); |
+ |
+ void DetermineFirstState(); |
+ |
+ void OnIOComplete(int result); |
+ |
+ // Runs the state transition loop. |
+ int DoLoop(int result); |
+ |
+ int DoTCPConnect(); |
+ int DoTCPConnectComplete(int result); |
+ int DoSOCKSConnect(); |
+ int DoSOCKSConnectComplete(int result); |
+ int DoTunnelConnect(); |
+ int DoTunnelConnectComplete(int result); |
+ int DoSSLConnect(); |
+ int DoSSLConnectComplete(int result); |
+ |
+ scoped_refptr<SSLSocketParams> params_; |
+ const scoped_refptr<TCPClientSocketPool> tcp_pool_; |
+ const scoped_refptr<HttpProxyClientSocketPool> http_proxy_pool_; |
+ const scoped_refptr<SOCKSClientSocketPool> socks_pool_; |
+ ClientSocketFactory* const client_socket_factory_; |
+ const scoped_refptr<HostResolver> resolver_; |
+ |
+ State next_state_; |
+ CompletionCallbackImpl<SSLConnectJob> callback_; |
+ scoped_ptr<ClientSocketHandle> transport_socket_handle_; |
+ scoped_ptr<SSLClientSocket> ssl_socket_; |
+ |
+ // The time the DoSSLConnect() method was called. |
+ base::TimeTicks ssl_connect_start_time_; |
+ |
+ scoped_refptr<HttpResponseHeaders> http_auth_response_headers_; |
+ scoped_refptr<AuthChallengeInfo> http_auth_auth_challenge_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SSLConnectJob); |
+}; |
+ |
+class SSLClientSocketPool : public ClientSocketPool { |
+ public: |
+ // Only the pools that will be used are required. i.e. if you never |
+ // try to create an SSL over SOCKS socket, |socks_pool| may be NULL. |
+ SSLClientSocketPool( |
+ int max_sockets, |
+ int max_sockets_per_group, |
+ const scoped_refptr<ClientSocketPoolHistograms>& histograms, |
+ const scoped_refptr<HostResolver>& host_resolver, |
+ ClientSocketFactory* client_socket_factory, |
+ const scoped_refptr<TCPClientSocketPool>& tcp_pool, |
+ const scoped_refptr<HttpProxyClientSocketPool>& http_proxy_pool, |
+ const scoped_refptr<SOCKSClientSocketPool>& socks_pool, |
+ NetLog* net_log); |
+ |
+ // ClientSocketPool methods: |
+ virtual int RequestSocket(const std::string& group_name, |
+ const void* connect_params, |
+ RequestPriority priority, |
+ ClientSocketHandle* handle, |
+ CompletionCallback* callback, |
+ const BoundNetLog& net_log); |
+ |
+ virtual void CancelRequest(const std::string& group_name, |
+ const ClientSocketHandle* handle); |
+ |
+ virtual void ReleaseSocket(const std::string& group_name, |
+ ClientSocket* socket, |
+ int id); |
+ |
+ virtual void Flush(); |
+ |
+ virtual void CloseIdleSockets(); |
+ |
+ virtual int IdleSocketCount() const { |
+ return base_.idle_socket_count(); |
+ } |
+ |
+ virtual int IdleSocketCountInGroup(const std::string& group_name) const; |
+ |
+ virtual LoadState GetLoadState(const std::string& group_name, |
+ const ClientSocketHandle* handle) const; |
+ |
+ virtual base::TimeDelta ConnectionTimeout() const { |
+ return base_.ConnectionTimeout(); |
+ } |
+ |
+ virtual scoped_refptr<ClientSocketPoolHistograms> histograms() const { |
+ return base_.histograms(); |
+ }; |
+ |
+ protected: |
+ virtual ~SSLClientSocketPool(); |
+ |
+ private: |
+ typedef ClientSocketPoolBase<SSLSocketParams> PoolBase; |
+ |
+ class SSLConnectJobFactory : public PoolBase::ConnectJobFactory { |
+ public: |
+ SSLConnectJobFactory( |
+ const scoped_refptr<TCPClientSocketPool>& tcp_pool, |
+ const scoped_refptr<HttpProxyClientSocketPool>& http_proxy_pool, |
+ const scoped_refptr<SOCKSClientSocketPool>& socks_pool, |
+ ClientSocketFactory* client_socket_factory, |
+ HostResolver* host_resolver, |
+ NetLog* net_log); |
+ |
+ virtual ~SSLConnectJobFactory() {} |
+ |
+ // ClientSocketPoolBase::ConnectJobFactory methods. |
+ virtual ConnectJob* NewConnectJob( |
+ const std::string& group_name, |
+ const PoolBase::Request& request, |
+ ConnectJob::Delegate* delegate) const; |
+ |
+ virtual base::TimeDelta ConnectionTimeout() const { return timeout_; } |
+ |
+ private: |
+ const scoped_refptr<TCPClientSocketPool> tcp_pool_; |
+ const scoped_refptr<HttpProxyClientSocketPool> http_proxy_pool_; |
+ const scoped_refptr<SOCKSClientSocketPool> socks_pool_; |
+ ClientSocketFactory* const client_socket_factory_; |
+ const scoped_refptr<HostResolver> host_resolver_; |
+ base::TimeDelta timeout_; |
+ NetLog* net_log_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SSLConnectJobFactory); |
+ }; |
+ |
+ PoolBase base_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SSLClientSocketPool); |
+}; |
+ |
+REGISTER_SOCKET_PARAMS_FOR_POOL(SSLClientSocketPool, SSLSocketParams); |
+ |
+} // namespace net |
+ |
+#endif // NET_SOCKET_SSL_CLIENT_SOCKET_POOL_H_ |