| 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
|
|
|