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

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: Changed location of enable_connect_job_waiting_ and added documentation. 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..3ad6f4b0484a9d35592f22f31c1a077e7e9cf5f2 100644
--- a/net/socket/ssl_client_socket_pool.h
+++ b/net/socket/ssl_client_socket_pool.h
@@ -5,10 +5,13 @@
#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"
+#include "base/memory/scoped_vector.h"
wtc 2014/07/11 00:48:55 Delete this. You aren't using ScopedVector any mor
mshelley 2014/07/11 23:26:28 Done.
#include "base/time/time.h"
#include "net/base/privacy_mode.h"
#include "net/dns/host_resolver.h"
@@ -94,23 +97,72 @@ 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.
+class NET_EXPORT_PRIVATE SSLConnectJobMessenger {
+ public:
+ struct SocketAndCallback {
+ SSLClientSocket* socket;
+ base::Closure callback;
+
+ SocketAndCallback(SSLClientSocket* ssl_socket,
+ base::Closure job_resumption_callback)
+ : socket(ssl_socket), callback(job_resumption_callback) {}
wtc 2014/07/11 00:48:55 List the constructor before data members. See the
mshelley 2014/07/11 23:26:28 Done.
+ };
+
+ typedef std::vector<SocketAndCallback> SSLPendingSocketsAndCallbacks;
+
+ // Returns true if the given |ssl_socket| should continue its
+ // SSL connection.
+ bool CanProceed(SSLClientSocket* ssl_socket);
+
+ // Informs the session cache that it should notify the SSLConnectJobMessenger
+ // upon the completion of |ssl_socket|'s connection.
+ void MonitorConnectionResult(SSLClientSocket* ssl_socket);
+
+ // Adds the socket and its associated callback to the SSLConnectJobMessenger's
+ // list of pending sockets and callbacks.
+ void AddPendingSocket(SSLClientSocket* socket, const base::Closure& callback);
+
+ // 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();
wtc 2014/07/11 00:48:55 I think OnJobSucceeded and OnJobFailed can be priv
mshelley 2014/07/11 23:26:27 Done.
+
+ private:
+ // Runs all callbacks stored in |pending_sockets_and_callbacks_|.
+ void RunAllJobs(std::vector<SocketAndCallback>& pending_socket_and_callbacks);
wtc 2014/07/11 00:48:55 RunAllJobs => RunAllCallbacks The input should be
mshelley 2014/07/11 23:26:28 Done.
+
+ SSLPendingSocketsAndCallbacks pending_sockets_and_callbacks_;
+ std::vector<SSLClientSocket*> connecting_sockets_;
wtc 2014/07/11 00:48:55 IMPORTANT: if there can be only one connecting soc
mshelley 2014/07/11 23:26:28 Done.
+};
+
// 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 +178,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 +196,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 +223,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 +315,11 @@ class NET_EXPORT_PRIVATE SSLClientSocketPool
// HigherLayeredPool implementation.
virtual bool CloseOneIdleConnection() OVERRIDE;
+ // Enable SSLConnectJob waiting if |enable| is true.
+ static NET_EXPORT void EnableConnectJobWaiting(bool enable);
+
+ static NET_EXPORT bool GetEnableConnectJobWaiting();
wtc 2014/07/11 00:48:55 These setter and getter methods should be named in
mshelley 2014/07/11 23:26:27 Done.
+
private:
typedef ClientSocketPoolBase<SSLSocketParams> PoolBase;
@@ -284,6 +351,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 +362,7 @@ class NET_EXPORT_PRIVATE SSLClientSocketPool
const SSLClientSocketContext context_;
base::TimeDelta timeout_;
NetLog* net_log_;
+ scoped_ptr<MessengerMap> messenger_map_;
wtc 2014/07/11 00:48:55 This doesn't need to be a scoped_ptr: Messenger
mshelley 2014/07/11 23:26:27 Here I think it does need to be a pointer because
DISALLOW_COPY_AND_ASSIGN(SSLConnectJobFactory);
};
@@ -302,6 +373,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