Index: net/socket/ssl_client_socket_pool.cc |
diff --git a/net/socket/ssl_client_socket_pool.cc b/net/socket/ssl_client_socket_pool.cc |
index 2566f3e0ffb3a79a10e5d537759f27ae0304ce04..6347c2b0592cee1af869c8aa09deaa8e8b0a14aa 100644 |
--- a/net/socket/ssl_client_socket_pool.cc |
+++ b/net/socket/ssl_client_socket_pool.cc |
@@ -99,12 +99,8 @@ SSLConnectJobMessenger::SSLConnectJobMessenger() : weak_factory_(this) { |
} |
bool SSLConnectJobMessenger::CanProceed(SSLClientSocket* ssl_socket) { |
- // If the session is in the session cache, or there are no connecting |
- // sockets allow the connection to proceed. |
- if (ssl_socket->InSessionCache() || connecting_sockets_.empty()) { |
- return true; |
- } |
- return false; |
+ // If there are no connecting sockets allow the connection to proceed. |
+ return connecting_sockets_.empty(); |
} |
void SSLConnectJobMessenger::MonitorConnectionResult( |
@@ -169,6 +165,10 @@ void SSLConnectJobMessenger::ConnectNewLeader() { |
callback.Run(); |
} |
+bool SSLConnectJobMessenger::IsNeeded() { |
+ return pending_sockets_and_callbacks_.empty() && connecting_sockets_.empty(); |
+} |
+ |
void SSLConnectJobMessenger::RunAllJobs( |
std::vector<SocketAndCallback>& pending_sockets_and_callbacks) { |
scoped_refptr<base::SingleThreadTaskRunner> task_runner = |
@@ -194,6 +194,8 @@ SSLConnectJob::SSLConnectJob(const std::string& group_name, |
HostResolver* host_resolver, |
const SSLClientSocketContext& context, |
SSLConnectJobMessenger* messenger, |
+ AddMessengerCallback add_messenger_callback, |
+ DeleteMessengerCallback delete_messenger_callback, |
Delegate* delegate, |
NetLog* net_log) |
: ConnectJob(group_name, |
@@ -217,7 +219,9 @@ SSLConnectJob::SSLConnectJob(const std::string& group_name, |
io_callback_( |
base::Bind(&SSLConnectJob::OnIOComplete, base::Unretained(this))), |
messenger_(messenger), |
- weak_factory_(this) { |
+ weak_factory_(this), |
+ add_messenger_callback_(add_messenger_callback), |
+ delete_messenger_callback_(delete_messenger_callback) { |
} |
SSLConnectJob::~SSLConnectJob() {} |
@@ -424,17 +428,24 @@ int SSLConnectJob::DoCreateSSLSocket() { |
params_->host_and_port(), |
params_->ssl_config(), |
context_); |
+ |
+ // Retrieve an SSLConnectJobMessenger for this connection if needed. |
+ if (!ssl_socket_->InSessionCache()) |
+ GetMessenger(ssl_socket_->GetSessionCacheKey()); |
+ |
return OK; |
} |
int SSLConnectJob::DoCheckForResume() { |
next_state_ = STATE_SSL_CONNECT; |
+ if (ssl_socket_->InSessionCache()) |
+ return OK; |
+ |
if (messenger_->CanProceed(ssl_socket_.get())) { |
- if (ssl_socket_->InSessionCache()) |
- return OK; |
messenger_->MonitorConnectionResult(ssl_socket_.get()); |
return OK; |
} |
+ |
messenger_->AddPendingSocket( |
ssl_socket_.get(), |
base::Bind(&net::SSLConnectJob::ResumeSSLConnection, |
@@ -453,9 +464,16 @@ int SSLConnectJob::DoSSLConnect() { |
int SSLConnectJob::DoSSLConnectComplete(int result) { |
connect_timing_.ssl_end = base::TimeTicks::Now(); |
- if (result != OK && SSLClientSocket::GetEnableConnectJobWaiting()) |
- messenger_->OnJobFailed(); |
- |
+ if (SSLClientSocket::GetEnableConnectJobWaiting() && messenger_ != NULL) { |
+ if (result != OK) |
+ messenger_->OnJobFailed(); |
+ else { |
+ // If the connection was successful, determine if the job's messenger is |
+ // still needed. If not, remove the messenger. |
+ if (!messenger_->IsNeeded()) |
+ DeleteMessenger(ssl_socket_->GetSessionCacheKey()); |
+ } |
+ } |
SSLClientSocket::NextProtoStatus status = |
SSLClientSocket::kNextProtoUnsupported; |
std::string proto; |
@@ -583,6 +601,15 @@ void SSLConnectJob::ResumeSSLConnection() { |
OnIOComplete(OK); |
} |
+void SSLConnectJob::GetMessenger(std::string cache_key) { |
+ messenger_ = add_messenger_callback_.Run(cache_key); |
+} |
+ |
+void SSLConnectJob::DeleteMessenger(std::string cache_key) { |
+ delete_messenger_callback_.Run(cache_key); |
+ messenger_ = NULL; |
+} |
+ |
SSLConnectJob::State SSLConnectJob::GetInitialState( |
SSLSocketParams::ConnectionType connection_type) { |
switch (connection_type) { |
@@ -616,8 +643,7 @@ SSLClientSocketPool::SSLConnectJobFactory::SSLConnectJobFactory( |
client_socket_factory_(client_socket_factory), |
host_resolver_(host_resolver), |
context_(context), |
- net_log_(net_log), |
- messenger_map_(new MessengerMap) { |
+ net_log_(net_log) { |
base::TimeDelta max_transport_timeout = base::TimeDelta(); |
base::TimeDelta pool_timeout; |
if (transport_pool_) |
@@ -689,40 +715,49 @@ SSLClientSocketPool::~SSLClientSocketPool() { |
ssl_config_service_->RemoveObserver(this); |
} |
-scoped_ptr<ConnectJob> |
-SSLClientSocketPool::SSLConnectJobFactory::NewConnectJob( |
- const std::string& group_name, |
- const PoolBase::Request& request, |
- ConnectJob::Delegate* delegate) const { |
- SSLConnectJobMessenger* messenger; |
- std::string cache_key = SSLClientSocket::FormatSessionCacheKey( |
- request.params()->host_and_port().ToString(), |
- context_.ssl_session_cache_shard); |
- if (SSLClientSocket::GetEnableConnectJobWaiting()) { |
- MessengerMap::const_iterator it = messenger_map_->find(cache_key); |
- if (it == messenger_map_->end()) { |
- std::pair<MessengerMap::iterator, bool> iter = messenger_map_->insert( |
- MessengerMap::value_type(cache_key, new SSLConnectJobMessenger())); |
+SSLConnectJobMessenger* |
+SSLClientSocketPool::SSLConnectJobFactory::AddSSLConnectJobMessenger( |
+ std::string cache_key) { |
+ MessengerMap::const_iterator it = messenger_map_.find(cache_key); |
+ if (it == messenger_map_.end()) { |
+ std::pair<MessengerMap::iterator, bool> iter = messenger_map_.insert( |
+ MessengerMap::value_type(cache_key, new SSLConnectJobMessenger())); |
it = iter.first; |
} |
- messenger = it->second; |
- } else { |
- messenger = NULL; |
- } |
+ return it->second; |
+} |
+ |
+void SSLClientSocketPool::SSLConnectJobFactory::DeleteSSLConnectJobMessenger( |
+ std::string cache_key) { |
+ MessengerMap::iterator it = messenger_map_.find(cache_key); |
+ delete it->second; |
+ messenger_map_.erase(it); |
+} |
- return scoped_ptr<ConnectJob>(new SSLConnectJob(group_name, |
- request.priority(), |
- request.params(), |
- ConnectionTimeout(), |
- transport_pool_, |
- socks_pool_, |
- http_proxy_pool_, |
- client_socket_factory_, |
- host_resolver_, |
- context_, |
- messenger, |
- delegate, |
- net_log_)); |
+scoped_ptr<ConnectJob> SSLClientSocketPool::SSLConnectJobFactory::NewConnectJob( |
+ const std::string& group_name, |
+ const PoolBase::Request& request, |
+ ConnectJob::Delegate* delegate) { |
+ return scoped_ptr<ConnectJob>(new SSLConnectJob( |
+ group_name, |
+ request.priority(), |
+ request.params(), |
+ ConnectionTimeout(), |
+ transport_pool_, |
+ socks_pool_, |
+ http_proxy_pool_, |
+ client_socket_factory_, |
+ host_resolver_, |
+ context_, |
+ NULL, |
+ base::Bind( |
+ &SSLClientSocketPool::SSLConnectJobFactory::AddSSLConnectJobMessenger, |
+ base::Unretained(this)), |
+ base::Bind(&SSLClientSocketPool::SSLConnectJobFactory:: |
+ DeleteSSLConnectJobMessenger, |
+ base::Unretained(this)), |
+ delegate, |
+ net_log_)); |
} |
base::TimeDelta |