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

Side by Side Diff: net/socket/ssl_client_socket_pool.cc

Issue 384873002: This CL changes the lifespan of SSLConnectJobMessengers so that they are created only when needed, (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@useloop
Patch Set: Rebase, fixed issue where messenger field wasn't set to NULL after deletion Created 6 years, 4 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/socket/ssl_client_socket_pool.h" 5 #include "net/socket/ssl_client_socket_pool.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/metrics/field_trial.h" 9 #include "base/metrics/field_trial.h"
10 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 97
98 SSLConnectJobMessenger::SocketAndCallback::SocketAndCallback( 98 SSLConnectJobMessenger::SocketAndCallback::SocketAndCallback(
99 SSLClientSocket* ssl_socket, 99 SSLClientSocket* ssl_socket,
100 const base::Closure& job_resumption_callback) 100 const base::Closure& job_resumption_callback)
101 : socket(ssl_socket), callback(job_resumption_callback) { 101 : socket(ssl_socket), callback(job_resumption_callback) {
102 } 102 }
103 103
104 SSLConnectJobMessenger::SocketAndCallback::~SocketAndCallback() { 104 SSLConnectJobMessenger::SocketAndCallback::~SocketAndCallback() {
105 } 105 }
106 106
107 SSLConnectJobMessenger::SSLConnectJobMessenger() : weak_factory_(this) { 107 SSLConnectJobMessenger::SSLConnectJobMessenger(
108 const ConnectionCompleteCallback& connection_complete_callback,
109 std::string group_name)
110 : group_name_(group_name),
111 weak_factory_(this),
112 connection_complete_callback_(connection_complete_callback) {
108 } 113 }
109 114
110 SSLConnectJobMessenger::~SSLConnectJobMessenger() { 115 SSLConnectJobMessenger::~SSLConnectJobMessenger() {
111 } 116 }
112 117
113 void SSLConnectJobMessenger::RemovePendingSocket(SSLClientSocket* ssl_socket) { 118 void SSLConnectJobMessenger::RemovePendingSocket(SSLClientSocket* ssl_socket) {
114 // Sockets do not need to be removed from connecting_sockets_ because 119 // Sockets do not need to be removed from connecting_sockets_ because
115 // OnSSLHandshakeCompleted will do this. 120 // OnSSLHandshakeCompleted will do this.
116 for (SSLPendingSocketsAndCallbacks::iterator it = 121 for (SSLPendingSocketsAndCallbacks::iterator it =
117 pending_sockets_and_callbacks_.begin(); 122 pending_sockets_and_callbacks_.begin();
118 it != pending_sockets_and_callbacks_.end(); 123 it != pending_sockets_and_callbacks_.end();
119 ++it) { 124 ++it) {
120 if (it->socket == ssl_socket) { 125 if (it->socket == ssl_socket) {
121 pending_sockets_and_callbacks_.erase(it); 126 pending_sockets_and_callbacks_.erase(it);
122 return; 127 return;
123 } 128 }
124 } 129 }
125 } 130 }
126 131
127 bool SSLConnectJobMessenger::CanProceed(SSLClientSocket* ssl_socket) { 132 bool SSLConnectJobMessenger::CanProceed(SSLClientSocket* ssl_socket) {
128 // If the session is in the session cache, or there are no connecting 133 // If there are no connecting sockets allow the connection to proceed.
129 // sockets, allow the connection to proceed. 134 return connecting_sockets_.empty();
130 return ssl_socket->InSessionCache() || connecting_sockets_.empty();
131 } 135 }
132 136
133 void SSLConnectJobMessenger::MonitorConnectionResult( 137 void SSLConnectJobMessenger::MonitorConnectionResult(
134 SSLClientSocket* ssl_socket) { 138 SSLClientSocket* ssl_socket) {
135 connecting_sockets_.push_back(ssl_socket); 139 connecting_sockets_.push_back(ssl_socket);
136 ssl_socket->SetHandshakeCompletionCallback( 140 ssl_socket->SetHandshakeCompletionCallback(
137 base::Bind(&SSLConnectJobMessenger::OnSSLHandshakeCompleted, 141 base::Bind(&SSLConnectJobMessenger::OnSSLHandshakeCompleted,
138 weak_factory_.GetWeakPtr())); 142 weak_factory_.GetWeakPtr()));
139 } 143 }
140 144
141 void SSLConnectJobMessenger::AddPendingSocket(SSLClientSocket* ssl_socket, 145 void SSLConnectJobMessenger::AddPendingSocket(SSLClientSocket* ssl_socket,
142 const base::Closure& callback) { 146 const base::Closure& callback) {
143 DCHECK(!connecting_sockets_.empty()); 147 DCHECK(!connecting_sockets_.empty());
144 pending_sockets_and_callbacks_.push_back( 148 pending_sockets_and_callbacks_.push_back(
145 SocketAndCallback(ssl_socket, callback)); 149 SocketAndCallback(ssl_socket, callback));
146 } 150 }
147 151
148 void SSLConnectJobMessenger::OnSSLHandshakeCompleted() { 152 void SSLConnectJobMessenger::OnSSLHandshakeCompleted() {
153 SSLClientSocket* ssl_socket = NULL;
154 if (!connecting_sockets_.empty())
155 ssl_socket = connecting_sockets_.front();
149 connecting_sockets_.clear(); 156 connecting_sockets_.clear();
150 SSLPendingSocketsAndCallbacks temp_list; 157 SSLPendingSocketsAndCallbacks temp_list;
151 temp_list.swap(pending_sockets_and_callbacks_); 158 temp_list.swap(pending_sockets_and_callbacks_);
152 RunAllCallbacks(temp_list); 159 RunAllCallbacks(temp_list);
160 if (ssl_socket) {
161 connection_complete_callback_.Run(ssl_socket->GetSessionCacheKey(),
162 group_name_);
163 }
153 } 164 }
154 165
155 void SSLConnectJobMessenger::RunAllCallbacks( 166 void SSLConnectJobMessenger::RunAllCallbacks(
156 const SSLPendingSocketsAndCallbacks& pending_sockets_and_callbacks) { 167 const SSLPendingSocketsAndCallbacks& pending_sockets_and_callbacks) {
157 for (std::vector<SocketAndCallback>::const_iterator it = 168 for (std::vector<SocketAndCallback>::const_iterator it =
158 pending_sockets_and_callbacks.begin(); 169 pending_sockets_and_callbacks.begin();
159 it != pending_sockets_and_callbacks.end(); 170 it != pending_sockets_and_callbacks.end();
160 ++it) { 171 ++it) {
161 it->callback.Run(); 172 it->callback.Run();
162 } 173 }
163 } 174 }
164 175
165 // Timeout for the SSL handshake portion of the connect. 176 // Timeout for the SSL handshake portion of the connect.
166 static const int kSSLHandshakeTimeoutInSeconds = 30; 177 static const int kSSLHandshakeTimeoutInSeconds = 30;
167 178
168 SSLConnectJob::SSLConnectJob(const std::string& group_name, 179 SSLConnectJob::SSLConnectJob(const std::string& group_name,
169 RequestPriority priority, 180 RequestPriority priority,
170 const scoped_refptr<SSLSocketParams>& params, 181 const scoped_refptr<SSLSocketParams>& params,
171 const base::TimeDelta& timeout_duration, 182 const base::TimeDelta& timeout_duration,
172 TransportClientSocketPool* transport_pool, 183 TransportClientSocketPool* transport_pool,
173 SOCKSClientSocketPool* socks_pool, 184 SOCKSClientSocketPool* socks_pool,
174 HttpProxyClientSocketPool* http_proxy_pool, 185 HttpProxyClientSocketPool* http_proxy_pool,
175 ClientSocketFactory* client_socket_factory, 186 ClientSocketFactory* client_socket_factory,
176 HostResolver* host_resolver, 187 HostResolver* host_resolver,
177 const SSLClientSocketContext& context, 188 const SSLClientSocketContext& context,
178 SSLConnectJobMessenger* messenger, 189 UncachedSessionCallback uncached_session_callback,
190 bool enable_ssl_connect_job_waiting,
179 Delegate* delegate, 191 Delegate* delegate,
180 NetLog* net_log) 192 NetLog* net_log)
181 : ConnectJob(group_name, 193 : ConnectJob(group_name,
182 timeout_duration, 194 timeout_duration,
183 priority, 195 priority,
184 delegate, 196 delegate,
185 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)), 197 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)),
186 params_(params), 198 params_(params),
187 transport_pool_(transport_pool), 199 transport_pool_(transport_pool),
188 socks_pool_(socks_pool), 200 socks_pool_(socks_pool),
189 http_proxy_pool_(http_proxy_pool), 201 http_proxy_pool_(http_proxy_pool),
190 client_socket_factory_(client_socket_factory), 202 client_socket_factory_(client_socket_factory),
191 host_resolver_(host_resolver), 203 host_resolver_(host_resolver),
192 context_(context.cert_verifier, 204 context_(context.cert_verifier,
193 context.channel_id_service, 205 context.channel_id_service,
194 context.transport_security_state, 206 context.transport_security_state,
195 context.cert_transparency_verifier, 207 context.cert_transparency_verifier,
196 (params->privacy_mode() == PRIVACY_MODE_ENABLED 208 (params->privacy_mode() == PRIVACY_MODE_ENABLED
197 ? "pm/" + context.ssl_session_cache_shard 209 ? "pm/" + context.ssl_session_cache_shard
198 : context.ssl_session_cache_shard)), 210 : context.ssl_session_cache_shard)),
199 io_callback_( 211 io_callback_(
200 base::Bind(&SSLConnectJob::OnIOComplete, base::Unretained(this))), 212 base::Bind(&SSLConnectJob::OnIOComplete, base::Unretained(this))),
201 messenger_(messenger), 213 messenger_(NULL),
202 weak_factory_(this) { 214 weak_factory_(this),
215 uncached_session_callback_(uncached_session_callback),
216 enable_ssl_connect_job_waiting_(enable_ssl_connect_job_waiting) {
203 } 217 }
204 218
205 SSLConnectJob::~SSLConnectJob() { 219 SSLConnectJob::~SSLConnectJob() {
206 if (ssl_socket_.get() && messenger_) 220 if (ssl_socket_.get() && messenger_)
207 messenger_->RemovePendingSocket(ssl_socket_.get()); 221 messenger_->RemovePendingSocket(ssl_socket_.get());
208 } 222 }
209 223
210 LoadState SSLConnectJob::GetLoadState() const { 224 LoadState SSLConnectJob::GetLoadState() const {
211 switch (next_state_) { 225 switch (next_state_) {
212 case STATE_TUNNEL_CONNECT_COMPLETE: 226 case STATE_TUNNEL_CONNECT_COMPLETE:
(...skipping 22 matching lines...) Expand all
235 // problem. See DoTunnelConnectComplete. 249 // problem. See DoTunnelConnectComplete.
236 if (error_response_info_.headers.get()) { 250 if (error_response_info_.headers.get()) {
237 handle->set_pending_http_proxy_connection( 251 handle->set_pending_http_proxy_connection(
238 transport_socket_handle_.release()); 252 transport_socket_handle_.release());
239 } 253 }
240 handle->set_ssl_error_response_info(error_response_info_); 254 handle->set_ssl_error_response_info(error_response_info_);
241 if (!connect_timing_.ssl_start.is_null()) 255 if (!connect_timing_.ssl_start.is_null())
242 handle->set_is_ssl_error(true); 256 handle->set_is_ssl_error(true);
243 } 257 }
244 258
259 void SSLConnectJob::RemoveMessenger(const std::string& cache_key) {
260 if (ssl_socket_->GetSessionCacheKey() == cache_key)
261 messenger_ = NULL;
262 }
263
245 void SSLConnectJob::OnIOComplete(int result) { 264 void SSLConnectJob::OnIOComplete(int result) {
246 int rv = DoLoop(result); 265 int rv = DoLoop(result);
247 if (rv != ERR_IO_PENDING) 266 if (rv != ERR_IO_PENDING)
248 NotifyDelegateOfCompletion(rv); // Deletes |this|. 267 NotifyDelegateOfCompletion(rv); // Deletes |this|.
249 } 268 }
250 269
251 int SSLConnectJob::DoLoop(int result) { 270 int SSLConnectJob::DoLoop(int result) {
252 DCHECK_NE(next_state_, STATE_NONE); 271 DCHECK_NE(next_state_, STATE_NONE);
253 272
254 int rv = result; 273 int rv = result;
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 connect_timing_.connect_start = socket_connect_timing.connect_start; 414 connect_timing_.connect_start = socket_connect_timing.connect_start;
396 connect_timing_.dns_start = socket_connect_timing.dns_start; 415 connect_timing_.dns_start = socket_connect_timing.dns_start;
397 connect_timing_.dns_end = socket_connect_timing.dns_end; 416 connect_timing_.dns_end = socket_connect_timing.dns_end;
398 } 417 }
399 418
400 ssl_socket_ = client_socket_factory_->CreateSSLClientSocket( 419 ssl_socket_ = client_socket_factory_->CreateSSLClientSocket(
401 transport_socket_handle_.Pass(), 420 transport_socket_handle_.Pass(),
402 params_->host_and_port(), 421 params_->host_and_port(),
403 params_->ssl_config(), 422 params_->ssl_config(),
404 context_); 423 context_);
424
425 if (!ssl_socket_->InSessionCache() && enable_ssl_connect_job_waiting_)
426 RunUncachedSessionCallback(ssl_socket_->GetSessionCacheKey());
427
405 return OK; 428 return OK;
406 } 429 }
407 430
408 int SSLConnectJob::DoCheckForResume() { 431 int SSLConnectJob::DoCheckForResume() {
409 next_state_ = STATE_SSL_CONNECT; 432 next_state_ = STATE_SSL_CONNECT;
410 if (!messenger_) 433
434 if (ssl_socket_->InSessionCache() || !messenger_)
411 return OK; 435 return OK;
412 436
413 // TODO(mshelley): Remove duplicate InSessionCache() calls.
414 if (messenger_->CanProceed(ssl_socket_.get())) { 437 if (messenger_->CanProceed(ssl_socket_.get())) {
415 if (!ssl_socket_->InSessionCache()) 438 messenger_->MonitorConnectionResult(ssl_socket_.get());
416 messenger_->MonitorConnectionResult(ssl_socket_.get());
417 return OK; 439 return OK;
418 } 440 }
419 messenger_->AddPendingSocket(ssl_socket_.get(), 441
420 base::Bind(&SSLConnectJob::ResumeSSLConnection, 442 messenger_->AddPendingSocket(
421 weak_factory_.GetWeakPtr())); 443 ssl_socket_.get(),
444 base::Bind(&net::SSLConnectJob::ResumeSSLConnection,
Ryan Sleevi 2014/08/12 00:27:42 no need for net:: here
mshelley 2014/08/12 21:47:01 Done.
445 weak_factory_.GetWeakPtr()));
446
422 return ERR_IO_PENDING; 447 return ERR_IO_PENDING;
423 } 448 }
424 449
425 int SSLConnectJob::DoSSLConnect() { 450 int SSLConnectJob::DoSSLConnect() {
426 next_state_ = STATE_SSL_CONNECT_COMPLETE; 451 next_state_ = STATE_SSL_CONNECT_COMPLETE;
427 452
428 connect_timing_.ssl_start = base::TimeTicks::Now(); 453 connect_timing_.ssl_start = base::TimeTicks::Now();
429 454
430 return ssl_socket_->Connect(io_callback_); 455 return ssl_socket_->Connect(io_callback_);
431 } 456 }
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 } 577 }
553 578
554 return result; 579 return result;
555 } 580 }
556 581
557 void SSLConnectJob::ResumeSSLConnection() { 582 void SSLConnectJob::ResumeSSLConnection() {
558 DCHECK_EQ(next_state_, STATE_SSL_CONNECT); 583 DCHECK_EQ(next_state_, STATE_SSL_CONNECT);
559 OnIOComplete(OK); 584 OnIOComplete(OK);
560 } 585 }
561 586
587 void SSLConnectJob::RunUncachedSessionCallback(std::string cache_key) {
588 messenger_ = uncached_session_callback_.Run(cache_key, group_name());
589 }
590
562 SSLConnectJob::State SSLConnectJob::GetInitialState( 591 SSLConnectJob::State SSLConnectJob::GetInitialState(
563 SSLSocketParams::ConnectionType connection_type) { 592 SSLSocketParams::ConnectionType connection_type) {
564 switch (connection_type) { 593 switch (connection_type) {
565 case SSLSocketParams::DIRECT: 594 case SSLSocketParams::DIRECT:
566 return STATE_TRANSPORT_CONNECT; 595 return STATE_TRANSPORT_CONNECT;
567 case SSLSocketParams::HTTP_PROXY: 596 case SSLSocketParams::HTTP_PROXY:
568 return STATE_TUNNEL_CONNECT; 597 return STATE_TUNNEL_CONNECT;
569 case SSLSocketParams::SOCKS_PROXY: 598 case SSLSocketParams::SOCKS_PROXY:
570 return STATE_SOCKS_CONNECT; 599 return STATE_SOCKS_CONNECT;
571 } 600 }
572 NOTREACHED(); 601 NOTREACHED();
573 return STATE_NONE; 602 return STATE_NONE;
574 } 603 }
575 604
576 int SSLConnectJob::ConnectInternal() { 605 int SSLConnectJob::ConnectInternal() {
577 next_state_ = GetInitialState(params_->GetConnectionType()); 606 next_state_ = GetInitialState(params_->GetConnectionType());
578 return DoLoop(OK); 607 return DoLoop(OK);
579 } 608 }
580 609
581 SSLClientSocketPool::SSLConnectJobFactory::SSLConnectJobFactory( 610 SSLClientSocketPool::SSLConnectJobFactory::SSLConnectJobFactory(
582 TransportClientSocketPool* transport_pool, 611 TransportClientSocketPool* transport_pool,
583 SOCKSClientSocketPool* socks_pool, 612 SOCKSClientSocketPool* socks_pool,
584 HttpProxyClientSocketPool* http_proxy_pool, 613 HttpProxyClientSocketPool* http_proxy_pool,
585 ClientSocketFactory* client_socket_factory, 614 ClientSocketFactory* client_socket_factory,
586 HostResolver* host_resolver, 615 HostResolver* host_resolver,
587 const SSLClientSocketContext& context, 616 const SSLClientSocketContext& context,
588 bool enable_ssl_connect_job_waiting, 617 bool enable_ssl_connect_job_waiting,
618 SSLConnectJob::UncachedSessionCallback uncached_session_callback,
589 NetLog* net_log) 619 NetLog* net_log)
590 : transport_pool_(transport_pool), 620 : transport_pool_(transport_pool),
591 socks_pool_(socks_pool), 621 socks_pool_(socks_pool),
592 http_proxy_pool_(http_proxy_pool), 622 http_proxy_pool_(http_proxy_pool),
593 client_socket_factory_(client_socket_factory), 623 client_socket_factory_(client_socket_factory),
594 host_resolver_(host_resolver), 624 host_resolver_(host_resolver),
595 context_(context), 625 context_(context),
596 enable_ssl_connect_job_waiting_(enable_ssl_connect_job_waiting), 626 enable_ssl_connect_job_waiting_(enable_ssl_connect_job_waiting),
597 net_log_(net_log), 627 uncached_session_callback_(uncached_session_callback),
598 messenger_map_(new MessengerMap) { 628 net_log_(net_log) {
599 base::TimeDelta max_transport_timeout = base::TimeDelta(); 629 base::TimeDelta max_transport_timeout = base::TimeDelta();
600 base::TimeDelta pool_timeout; 630 base::TimeDelta pool_timeout;
601 if (transport_pool_) 631 if (transport_pool_)
602 max_transport_timeout = transport_pool_->ConnectionTimeout(); 632 max_transport_timeout = transport_pool_->ConnectionTimeout();
603 if (socks_pool_) { 633 if (socks_pool_) {
604 pool_timeout = socks_pool_->ConnectionTimeout(); 634 pool_timeout = socks_pool_->ConnectionTimeout();
605 if (pool_timeout > max_transport_timeout) 635 if (pool_timeout > max_transport_timeout)
606 max_transport_timeout = pool_timeout; 636 max_transport_timeout = pool_timeout;
607 } 637 }
608 if (http_proxy_pool_) { 638 if (http_proxy_pool_) {
609 pool_timeout = http_proxy_pool_->ConnectionTimeout(); 639 pool_timeout = http_proxy_pool_->ConnectionTimeout();
610 if (pool_timeout > max_transport_timeout) 640 if (pool_timeout > max_transport_timeout)
611 max_transport_timeout = pool_timeout; 641 max_transport_timeout = pool_timeout;
612 } 642 }
613 timeout_ = max_transport_timeout + 643 timeout_ = max_transport_timeout +
614 base::TimeDelta::FromSeconds(kSSLHandshakeTimeoutInSeconds); 644 base::TimeDelta::FromSeconds(kSSLHandshakeTimeoutInSeconds);
615 } 645 }
616 646
617 SSLClientSocketPool::SSLConnectJobFactory::~SSLConnectJobFactory() { 647 SSLClientSocketPool::SSLConnectJobFactory::~SSLConnectJobFactory() {
618 STLDeleteValues(messenger_map_.get());
619 } 648 }
620 649
621 SSLClientSocketPool::SSLClientSocketPool( 650 SSLClientSocketPool::SSLClientSocketPool(
622 int max_sockets, 651 int max_sockets,
623 int max_sockets_per_group, 652 int max_sockets_per_group,
624 ClientSocketPoolHistograms* histograms, 653 ClientSocketPoolHistograms* histograms,
625 HostResolver* host_resolver, 654 HostResolver* host_resolver,
626 CertVerifier* cert_verifier, 655 CertVerifier* cert_verifier,
627 ChannelIDService* channel_id_service, 656 ChannelIDService* channel_id_service,
628 TransportSecurityState* transport_security_state, 657 TransportSecurityState* transport_security_state,
(...skipping 20 matching lines...) Expand all
649 socks_pool, 678 socks_pool,
650 http_proxy_pool, 679 http_proxy_pool,
651 client_socket_factory, 680 client_socket_factory,
652 host_resolver, 681 host_resolver,
653 SSLClientSocketContext(cert_verifier, 682 SSLClientSocketContext(cert_verifier,
654 channel_id_service, 683 channel_id_service,
655 transport_security_state, 684 transport_security_state,
656 cert_transparency_verifier, 685 cert_transparency_verifier,
657 ssl_session_cache_shard), 686 ssl_session_cache_shard),
658 enable_ssl_connect_job_waiting, 687 enable_ssl_connect_job_waiting,
688 base::Bind(&SSLClientSocketPool::AddSSLConnectJobMessenger,
689 base::Unretained(this)),
659 net_log)), 690 net_log)),
660 ssl_config_service_(ssl_config_service) { 691 ssl_config_service_(ssl_config_service) {
661 if (ssl_config_service_.get()) 692 if (ssl_config_service_.get())
662 ssl_config_service_->AddObserver(this); 693 ssl_config_service_->AddObserver(this);
663 if (transport_pool_) 694 if (transport_pool_)
664 base_.AddLowerLayeredPool(transport_pool_); 695 base_.AddLowerLayeredPool(transport_pool_);
665 if (socks_pool_) 696 if (socks_pool_)
666 base_.AddLowerLayeredPool(socks_pool_); 697 base_.AddLowerLayeredPool(socks_pool_);
667 if (http_proxy_pool_) 698 if (http_proxy_pool_)
668 base_.AddLowerLayeredPool(http_proxy_pool_); 699 base_.AddLowerLayeredPool(http_proxy_pool_);
669 } 700 }
670 701
671 SSLClientSocketPool::~SSLClientSocketPool() { 702 SSLClientSocketPool::~SSLClientSocketPool() {
703 for (MessengerMap::iterator it = messenger_map_.begin();
704 it != messenger_map_.end();
705 ++it) {
706 delete it->second;
707 }
672 if (ssl_config_service_.get()) 708 if (ssl_config_service_.get())
673 ssl_config_service_->RemoveObserver(this); 709 ssl_config_service_->RemoveObserver(this);
674 } 710 }
675 711
676 scoped_ptr<ConnectJob> 712 scoped_ptr<ConnectJob> SSLClientSocketPool::SSLConnectJobFactory::NewConnectJob(
677 SSLClientSocketPool::SSLConnectJobFactory::NewConnectJob(
678 const std::string& group_name, 713 const std::string& group_name,
679 const PoolBase::Request& request, 714 const PoolBase::Request& request,
680 ConnectJob::Delegate* delegate) const { 715 ConnectJob::Delegate* delegate) {
681 SSLConnectJobMessenger* messenger = NULL; 716 return scoped_ptr<ConnectJob>(
682 if (enable_ssl_connect_job_waiting_) { 717 new SSLConnectJob(group_name,
683 std::string cache_key = SSLClientSocket::CreateSessionCacheKey( 718 request.priority(),
684 request.params()->host_and_port(), context_.ssl_session_cache_shard); 719 request.params(),
685 MessengerMap::const_iterator it = messenger_map_->find(cache_key); 720 ConnectionTimeout(),
686 if (it == messenger_map_->end()) { 721 transport_pool_,
687 std::pair<MessengerMap::iterator, bool> iter = messenger_map_->insert( 722 socks_pool_,
688 MessengerMap::value_type(cache_key, new SSLConnectJobMessenger())); 723 http_proxy_pool_,
689 it = iter.first; 724 client_socket_factory_,
690 } 725 host_resolver_,
691 messenger = it->second; 726 context_,
692 } 727 uncached_session_callback_,
693 728 enable_ssl_connect_job_waiting_,
694 return scoped_ptr<ConnectJob>(new SSLConnectJob(group_name, 729 delegate,
695 request.priority(), 730 net_log_));
696 request.params(),
697 ConnectionTimeout(),
698 transport_pool_,
699 socks_pool_,
700 http_proxy_pool_,
701 client_socket_factory_,
702 host_resolver_,
703 context_,
704 messenger,
705 delegate,
706 net_log_));
707 } 731 }
708 732
709 base::TimeDelta 733 base::TimeDelta SSLClientSocketPool::SSLConnectJobFactory::ConnectionTimeout()
710 SSLClientSocketPool::SSLConnectJobFactory::ConnectionTimeout() const { 734 const {
711 return timeout_; 735 return timeout_;
712 } 736 }
713 737
714 int SSLClientSocketPool::RequestSocket(const std::string& group_name, 738 int SSLClientSocketPool::RequestSocket(const std::string& group_name,
715 const void* socket_params, 739 const void* socket_params,
716 RequestPriority priority, 740 RequestPriority priority,
717 ClientSocketHandle* handle, 741 ClientSocketHandle* handle,
718 const CompletionCallback& callback, 742 const CompletionCallback& callback,
719 const BoundNetLog& net_log) { 743 const BoundNetLog& net_log) {
720 const scoped_refptr<SSLSocketParams>* casted_socket_params = 744 const scoped_refptr<SSLSocketParams>* casted_socket_params =
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
815 HigherLayeredPool* higher_pool) { 839 HigherLayeredPool* higher_pool) {
816 base_.RemoveHigherLayeredPool(higher_pool); 840 base_.RemoveHigherLayeredPool(higher_pool);
817 } 841 }
818 842
819 bool SSLClientSocketPool::CloseOneIdleConnection() { 843 bool SSLClientSocketPool::CloseOneIdleConnection() {
820 if (base_.CloseOneIdleSocket()) 844 if (base_.CloseOneIdleSocket())
821 return true; 845 return true;
822 return base_.CloseOneIdleConnectionInHigherLayeredPool(); 846 return base_.CloseOneIdleConnectionInHigherLayeredPool();
823 } 847 }
824 848
849 SSLConnectJobMessenger* SSLClientSocketPool::AddSSLConnectJobMessenger(
850 std::string cache_key,
851 std::string group_name) {
852 MessengerMap::const_iterator it = messenger_map_.find(cache_key);
853 if (it == messenger_map_.end()) {
854 std::pair<MessengerMap::iterator, bool> iter =
855 messenger_map_.insert(MessengerMap::value_type(
856 cache_key,
857 new SSLConnectJobMessenger(
858 base::Bind(&SSLClientSocketPool::DeleteSSLConnectJobMessenger,
859 base::Unretained(this)),
860 group_name)));
861 it = iter.first;
862 }
863 return it->second;
864 }
865
866 void SSLClientSocketPool::DeleteSSLConnectJobMessenger(std::string cache_key,
867 std::string group_name) {
868 MessengerMap::iterator it = messenger_map_.find(cache_key);
869 delete it->second;
870 messenger_map_.erase(it);
871 base_.RemoveMessengersFromGroup(group_name, cache_key);
872 }
873
825 void SSLClientSocketPool::OnSSLConfigChanged() { 874 void SSLClientSocketPool::OnSSLConfigChanged() {
826 FlushWithError(ERR_NETWORK_CHANGED); 875 FlushWithError(ERR_NETWORK_CHANGED);
827 } 876 }
828 877
829 } // namespace net 878 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698