Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(167)

Unified Diff: net/socket/ssl_client_socket_pool.h

Issue 353713005: Implements new, more robust design for communicating between SSLConnectJobs. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed comment issues, addressed case where session is NULL Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
index e03b76ade6ab5946e2d981e7d7802b1cb70d6dba..849b621d5e1069c9993166ecda97c7b34c985917 100644
--- a/net/socket/ssl_client_socket_pool.h
+++ b/net/socket/ssl_client_socket_pool.h
@@ -5,7 +5,9 @@
#ifndef NET_SOCKET_SSL_CLIENT_SOCKET_POOL_H_
#define NET_SOCKET_SSL_CLIENT_SOCKET_POOL_H_
+#include <map>
#include <string>
+#include <vector>
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
@@ -94,23 +96,84 @@ class NET_EXPORT_PRIVATE SSLSocketParams
DISALLOW_COPY_AND_ASSIGN(SSLSocketParams);
};
+// SSLConnectJobMessenger handles communication between concurrent
+// SSLConnectJobs that share the same SSL session cache key.
+//
+// SSLConnectJobMessengers tell the session cache when a certain
+// connection should be monitored for success or failure, and
+// tell SSLConnectJobs when to pause or resume thier connections.
Ryan Sleevi 2014/07/18 22:01:17 typo: thier -> their
mshelley 2014/07/21 23:00:09 Done.
+class SSLConnectJobMessenger {
+ public:
+ struct SocketAndCallback {
+ SocketAndCallback(SSLClientSocket* ssl_socket,
+ const base::Closure& job_resumption_callback)
+ : socket(ssl_socket), callback(job_resumption_callback) {}
+
+ SSLClientSocket* socket;
+ base::Closure callback;
+ };
+
+ typedef std::vector<SocketAndCallback> SSLPendingSocketsAndCallbacks;
+
+ // Removes |socket| from |pending_sockets_and_callbacks_| if it is present.
Ryan Sleevi 2014/07/18 22:01:17 Rather than talking strictly about what this does,
mshelley 2014/07/21 23:00:08 Done.
+ void RemovePendingSocket(SSLClientSocket* ssl_socket);
+
+ // Returns true if |ssl_socket|'s Connect() method should be called.
+ bool CanProceed(SSLClientSocket* ssl_socket);
+
+ // Configures the SSLConnectJobMessenger to begin monitoring |ssl_socket|'s
+ // connection status. After a successful connection, or an error,
+ // the messenger will determine which sockets that have been added
+ // via AddPendingSocket() to allow to proceed.
+ void MonitorConnectionResult(SSLClientSocket* ssl_socket);
+
+ // Adds |socket| to the list of sockets waiting to Connect(). When
+ // the messenger has determined that it's an appropriate time for |socket|
+ // to connect, it will asynchronously invoke |callback|.
+ //
+ // Note: It is an error to call AddPendingSocket() without having first
+ // called MonitorConnectionResult() and configuring a socket that WILL
+ // have Connect() called on it.
+ void AddPendingSocket(SSLClientSocket* socket, const base::Closure& callback);
Ryan Sleevi 2014/07/18 22:01:17 nit: variable naming - you call this ssl_socket fo
mshelley 2014/07/21 23:00:09 Done.
+
+ private:
+ // Processes pending callbacks when a socket successfully completes
+ // its connection.
+ void OnJobSucceeded();
+
+ // Processes pending callbacks when a socket encounters an error
+ // while completing its connection.
+ void OnJobFailed();
+
+ // Runs all callbacks stored in |pending_sockets_and_callbacks_|.
+ void RunAllCallbacks(
+ const SSLPendingSocketsAndCallbacks& pending_socket_and_callbacks);
+
+ SSLPendingSocketsAndCallbacks pending_sockets_and_callbacks_;
+ // Note: this field is a vector to allow for future design changes. Currently,
+ // this vector should only ever have one entry.
+ std::vector<SSLClientSocket*> connecting_sockets_;
+};
+
// 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,
- RequestPriority priority,
- const scoped_refptr<SSLSocketParams>& params,
- const base::TimeDelta& timeout_duration,
- TransportClientSocketPool* transport_pool,
- SOCKSClientSocketPool* socks_pool,
- HttpProxyClientSocketPool* http_proxy_pool,
- ClientSocketFactory* client_socket_factory,
- HostResolver* host_resolver,
- const SSLClientSocketContext& context,
- Delegate* delegate,
- NetLog* net_log);
+ // Note: the SSLConnectJob does not own |messenger| so it must outlive the
+ // job.
+ SSLConnectJob(const std::string& group_name,
+ RequestPriority priority,
+ const scoped_refptr<SSLSocketParams>& params,
+ const base::TimeDelta& timeout_duration,
+ TransportClientSocketPool* transport_pool,
+ SOCKSClientSocketPool* socks_pool,
+ HttpProxyClientSocketPool* http_proxy_pool,
+ ClientSocketFactory* client_socket_factory,
+ HostResolver* host_resolver,
+ const SSLClientSocketContext& context,
+ SSLConnectJobMessenger* messenger,
+ Delegate* delegate,
+ NetLog* net_log);
virtual ~SSLConnectJob();
// ConnectJob methods.
@@ -126,6 +189,8 @@ class SSLConnectJob : public ConnectJob {
STATE_SOCKS_CONNECT_COMPLETE,
STATE_TUNNEL_CONNECT,
STATE_TUNNEL_CONNECT_COMPLETE,
+ STATE_CREATE_SSL_SOCKET,
+ STATE_CHECK_FOR_RESUME,
STATE_SSL_CONNECT,
STATE_SSL_CONNECT_COMPLETE,
STATE_NONE,
@@ -142,9 +207,14 @@ class SSLConnectJob : public ConnectJob {
int DoSOCKSConnectComplete(int result);
int DoTunnelConnect();
int DoTunnelConnectComplete(int result);
+ int DoCreateSSLSocket();
+ int DoCheckForResume();
int DoSSLConnect();
int DoSSLConnectComplete(int result);
+ // Tells a waiting SSLConnectJob to resume its SSL connection.
+ void ResumeSSLConnection();
+
// Returns the initial state for the state machine based on the
// |connection_type|.
static State GetInitialState(SSLSocketParams::ConnectionType connection_type);
@@ -164,12 +234,15 @@ class SSLConnectJob : public ConnectJob {
const SSLClientSocketContext context_;
State next_state_;
- CompletionCallback callback_;
+ CompletionCallback io_callback_;
scoped_ptr<ClientSocketHandle> transport_socket_handle_;
scoped_ptr<SSLClientSocket> ssl_socket_;
+ SSLConnectJobMessenger* messenger_;
HttpResponseInfo error_response_info_;
+ base::WeakPtrFactory<SSLConnectJob> weak_factory_;
+
DISALLOW_COPY_AND_ASSIGN(SSLConnectJob);
};
@@ -253,6 +326,11 @@ class NET_EXPORT_PRIVATE SSLClientSocketPool
// HigherLayeredPool implementation.
virtual bool CloseOneIdleConnection() OVERRIDE;
+ // Enables SSLConnectJob waiting if |enable| is true.
+ static NET_EXPORT void set_enable_connect_job_waiting(bool enable);
+
+ static NET_EXPORT bool get_enable_connect_job_waiting();
+
private:
typedef ClientSocketPoolBase<SSLSocketParams> PoolBase;
@@ -273,7 +351,7 @@ class NET_EXPORT_PRIVATE SSLClientSocketPool
const SSLClientSocketContext& context,
NetLog* net_log);
- virtual ~SSLConnectJobFactory() {}
+ virtual ~SSLConnectJobFactory();
// ClientSocketPoolBase::ConnectJobFactory methods.
virtual scoped_ptr<ConnectJob> NewConnectJob(
@@ -284,6 +362,9 @@ class NET_EXPORT_PRIVATE SSLClientSocketPool
virtual base::TimeDelta ConnectionTimeout() const OVERRIDE;
private:
+ // Maps SSLConnectJob cache keys to SSLConnectJobMessenger objects.
+ typedef std::map<std::string, SSLConnectJobMessenger*> MessengerMap;
+
TransportClientSocketPool* const transport_pool_;
SOCKSClientSocketPool* const socks_pool_;
HttpProxyClientSocketPool* const http_proxy_pool_;
@@ -292,6 +373,8 @@ class NET_EXPORT_PRIVATE SSLClientSocketPool
const SSLClientSocketContext context_;
base::TimeDelta timeout_;
NetLog* net_log_;
+ // TODO(mshelley) Change this to a non-pointer.
+ scoped_ptr<MessengerMap> messenger_map_;
DISALLOW_COPY_AND_ASSIGN(SSLConnectJobFactory);
};
@@ -302,6 +385,8 @@ class NET_EXPORT_PRIVATE SSLClientSocketPool
PoolBase base_;
const scoped_refptr<SSLConfigService> ssl_config_service_;
+ static bool enable_connect_job_waiting_;
+
DISALLOW_COPY_AND_ASSIGN(SSLClientSocketPool);
};

Powered by Google App Engine
This is Rietveld 408576698