OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/metrics/histogram.h" | 7 #include "base/metrics/histogram.h" |
8 #include "base/values.h" | 8 #include "base/values.h" |
9 #include "net/base/net_errors.h" | 9 #include "net/base/net_errors.h" |
10 #include "net/base/host_port_pair.h" | 10 #include "net/base/host_port_pair.h" |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 return transport_socket_handle_->GetLoadState(); | 114 return transport_socket_handle_->GetLoadState(); |
115 case STATE_SSL_CONNECT: | 115 case STATE_SSL_CONNECT: |
116 case STATE_SSL_CONNECT_COMPLETE: | 116 case STATE_SSL_CONNECT_COMPLETE: |
117 return LOAD_STATE_SSL_HANDSHAKE; | 117 return LOAD_STATE_SSL_HANDSHAKE; |
118 default: | 118 default: |
119 NOTREACHED(); | 119 NOTREACHED(); |
120 return LOAD_STATE_IDLE; | 120 return LOAD_STATE_IDLE; |
121 } | 121 } |
122 } | 122 } |
123 | 123 |
124 int SSLConnectJob::ConnectInternal() { | 124 void SSLConnectJob::GetAdditionalErrorState(ClientSocketHandle * handle) { |
125 switch (params_->proxy()) { | 125 // Headers in |error_response_info_| indicate a proxy tunnel setup |
126 case ProxyServer::SCHEME_DIRECT: | 126 // problem. See DoTunnelConnectComplete. |
127 next_state_ = STATE_TCP_CONNECT; | 127 if (error_response_info_.headers) { |
128 break; | 128 handle->set_pending_http_proxy_connection( |
129 case ProxyServer::SCHEME_HTTP: | 129 transport_socket_handle_.release()); |
130 case ProxyServer::SCHEME_HTTPS: | |
131 next_state_ = STATE_TUNNEL_CONNECT; | |
132 break; | |
133 case ProxyServer::SCHEME_SOCKS4: | |
134 case ProxyServer::SCHEME_SOCKS5: | |
135 next_state_ = STATE_SOCKS_CONNECT; | |
136 break; | |
137 default: | |
138 NOTREACHED() << "unknown proxy type"; | |
139 break; | |
140 } | 130 } |
141 return DoLoop(OK); | 131 handle->set_ssl_error_response_info(error_response_info_); |
| 132 if (!ssl_connect_start_time_.is_null()) |
| 133 handle->set_is_ssl_error(true); |
142 } | 134 } |
143 | 135 |
144 void SSLConnectJob::OnIOComplete(int result) { | 136 void SSLConnectJob::OnIOComplete(int result) { |
145 int rv = DoLoop(result); | 137 int rv = DoLoop(result); |
146 if (rv != ERR_IO_PENDING) | 138 if (rv != ERR_IO_PENDING) |
147 NotifyDelegateOfCompletion(rv); // Deletes |this|. | 139 NotifyDelegateOfCompletion(rv); // Deletes |this|. |
148 } | 140 } |
149 | 141 |
150 int SSLConnectJob::DoLoop(int result) { | 142 int SSLConnectJob::DoLoop(int result) { |
151 DCHECK_NE(next_state_, STATE_NONE); | 143 DCHECK_NE(next_state_, STATE_NONE); |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
269 static_cast<HttpProxyClientSocket*>(socket); | 261 static_cast<HttpProxyClientSocket*>(socket); |
270 error_response_info_ = *tunnel_socket->GetConnectResponseInfo(); | 262 error_response_info_ = *tunnel_socket->GetConnectResponseInfo(); |
271 } | 263 } |
272 if (result < 0) | 264 if (result < 0) |
273 return result; | 265 return result; |
274 | 266 |
275 next_state_ = STATE_SSL_CONNECT; | 267 next_state_ = STATE_SSL_CONNECT; |
276 return result; | 268 return result; |
277 } | 269 } |
278 | 270 |
279 void SSLConnectJob::GetAdditionalErrorState(ClientSocketHandle * handle) { | |
280 // Headers in |error_response_info_| indicate a proxy tunnel setup | |
281 // problem. See DoTunnelConnectComplete. | |
282 if (error_response_info_.headers) { | |
283 handle->set_pending_http_proxy_connection( | |
284 transport_socket_handle_.release()); | |
285 } | |
286 handle->set_ssl_error_response_info(error_response_info_); | |
287 if (!ssl_connect_start_time_.is_null()) | |
288 handle->set_is_ssl_error(true); | |
289 } | |
290 | |
291 int SSLConnectJob::DoSSLConnect() { | 271 int SSLConnectJob::DoSSLConnect() { |
292 next_state_ = STATE_SSL_CONNECT_COMPLETE; | 272 next_state_ = STATE_SSL_CONNECT_COMPLETE; |
293 // Reset the timeout to just the time allowed for the SSL handshake. | 273 // Reset the timeout to just the time allowed for the SSL handshake. |
294 ResetTimer(base::TimeDelta::FromSeconds(kSSLHandshakeTimeoutInSeconds)); | 274 ResetTimer(base::TimeDelta::FromSeconds(kSSLHandshakeTimeoutInSeconds)); |
295 ssl_connect_start_time_ = base::TimeTicks::Now(); | 275 ssl_connect_start_time_ = base::TimeTicks::Now(); |
296 | 276 |
297 ssl_socket_.reset(client_socket_factory_->CreateSSLClientSocket( | 277 ssl_socket_.reset(client_socket_factory_->CreateSSLClientSocket( |
298 transport_socket_handle_.release(), params_->host_and_port(), | 278 transport_socket_handle_.release(), params_->host_and_port(), |
299 params_->ssl_config(), ssl_host_info_.release(), cert_verifier_, | 279 params_->ssl_config(), ssl_host_info_.release(), cert_verifier_, |
300 dns_cert_checker_)); | 280 dns_cert_checker_)); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 if (result == OK || IsCertificateError(result)) { | 334 if (result == OK || IsCertificateError(result)) { |
355 set_socket(ssl_socket_.release()); | 335 set_socket(ssl_socket_.release()); |
356 } else if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) { | 336 } else if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) { |
357 error_response_info_.cert_request_info = new SSLCertRequestInfo; | 337 error_response_info_.cert_request_info = new SSLCertRequestInfo; |
358 ssl_socket_->GetSSLCertRequestInfo(error_response_info_.cert_request_info); | 338 ssl_socket_->GetSSLCertRequestInfo(error_response_info_.cert_request_info); |
359 } | 339 } |
360 | 340 |
361 return result; | 341 return result; |
362 } | 342 } |
363 | 343 |
364 ConnectJob* SSLClientSocketPool::SSLConnectJobFactory::NewConnectJob( | 344 int SSLConnectJob::ConnectInternal() { |
365 const std::string& group_name, | 345 switch (params_->proxy()) { |
366 const PoolBase::Request& request, | 346 case ProxyServer::SCHEME_DIRECT: |
367 ConnectJob::Delegate* delegate) const { | 347 next_state_ = STATE_TCP_CONNECT; |
368 return new SSLConnectJob(group_name, request.params(), ConnectionTimeout(), | 348 break; |
369 tcp_pool_, socks_pool_, http_proxy_pool_, | 349 case ProxyServer::SCHEME_HTTP: |
370 client_socket_factory_, host_resolver_, | 350 case ProxyServer::SCHEME_HTTPS: |
371 cert_verifier_, dnsrr_resolver_, dns_cert_checker_, | 351 next_state_ = STATE_TUNNEL_CONNECT; |
372 ssl_host_info_factory_, delegate, net_log_); | 352 break; |
| 353 case ProxyServer::SCHEME_SOCKS4: |
| 354 case ProxyServer::SCHEME_SOCKS5: |
| 355 next_state_ = STATE_SOCKS_CONNECT; |
| 356 break; |
| 357 default: |
| 358 NOTREACHED() << "unknown proxy type"; |
| 359 break; |
| 360 } |
| 361 return DoLoop(OK); |
373 } | 362 } |
374 | 363 |
375 SSLClientSocketPool::SSLConnectJobFactory::SSLConnectJobFactory( | 364 SSLClientSocketPool::SSLConnectJobFactory::SSLConnectJobFactory( |
376 TCPClientSocketPool* tcp_pool, | 365 TCPClientSocketPool* tcp_pool, |
377 SOCKSClientSocketPool* socks_pool, | 366 SOCKSClientSocketPool* socks_pool, |
378 HttpProxyClientSocketPool* http_proxy_pool, | 367 HttpProxyClientSocketPool* http_proxy_pool, |
379 ClientSocketFactory* client_socket_factory, | 368 ClientSocketFactory* client_socket_factory, |
380 HostResolver* host_resolver, | 369 HostResolver* host_resolver, |
381 CertVerifier* cert_verifier, | 370 CertVerifier* cert_verifier, |
382 DnsRRResolver* dnsrr_resolver, | 371 DnsRRResolver* dnsrr_resolver, |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
441 ssl_config_service_(ssl_config_service) { | 430 ssl_config_service_(ssl_config_service) { |
442 if (ssl_config_service_) | 431 if (ssl_config_service_) |
443 ssl_config_service_->AddObserver(this); | 432 ssl_config_service_->AddObserver(this); |
444 } | 433 } |
445 | 434 |
446 SSLClientSocketPool::~SSLClientSocketPool() { | 435 SSLClientSocketPool::~SSLClientSocketPool() { |
447 if (ssl_config_service_) | 436 if (ssl_config_service_) |
448 ssl_config_service_->RemoveObserver(this); | 437 ssl_config_service_->RemoveObserver(this); |
449 } | 438 } |
450 | 439 |
| 440 ConnectJob* SSLClientSocketPool::SSLConnectJobFactory::NewConnectJob( |
| 441 const std::string& group_name, |
| 442 const PoolBase::Request& request, |
| 443 ConnectJob::Delegate* delegate) const { |
| 444 return new SSLConnectJob(group_name, request.params(), ConnectionTimeout(), |
| 445 tcp_pool_, socks_pool_, http_proxy_pool_, |
| 446 client_socket_factory_, host_resolver_, |
| 447 cert_verifier_, dnsrr_resolver_, dns_cert_checker_, |
| 448 ssl_host_info_factory_, delegate, net_log_); |
| 449 } |
| 450 |
451 int SSLClientSocketPool::RequestSocket(const std::string& group_name, | 451 int SSLClientSocketPool::RequestSocket(const std::string& group_name, |
452 const void* socket_params, | 452 const void* socket_params, |
453 RequestPriority priority, | 453 RequestPriority priority, |
454 ClientSocketHandle* handle, | 454 ClientSocketHandle* handle, |
455 CompletionCallback* callback, | 455 CompletionCallback* callback, |
456 const BoundNetLog& net_log) { | 456 const BoundNetLog& net_log) { |
457 const scoped_refptr<SSLSocketParams>* casted_socket_params = | 457 const scoped_refptr<SSLSocketParams>* casted_socket_params = |
458 static_cast<const scoped_refptr<SSLSocketParams>*>(socket_params); | 458 static_cast<const scoped_refptr<SSLSocketParams>*>(socket_params); |
459 | 459 |
460 return base_.RequestSocket(group_name, *casted_socket_params, priority, | 460 return base_.RequestSocket(group_name, *casted_socket_params, priority, |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
497 int SSLClientSocketPool::IdleSocketCountInGroup( | 497 int SSLClientSocketPool::IdleSocketCountInGroup( |
498 const std::string& group_name) const { | 498 const std::string& group_name) const { |
499 return base_.IdleSocketCountInGroup(group_name); | 499 return base_.IdleSocketCountInGroup(group_name); |
500 } | 500 } |
501 | 501 |
502 LoadState SSLClientSocketPool::GetLoadState( | 502 LoadState SSLClientSocketPool::GetLoadState( |
503 const std::string& group_name, const ClientSocketHandle* handle) const { | 503 const std::string& group_name, const ClientSocketHandle* handle) const { |
504 return base_.GetLoadState(group_name, handle); | 504 return base_.GetLoadState(group_name, handle); |
505 } | 505 } |
506 | 506 |
507 void SSLClientSocketPool::OnSSLConfigChanged() { | |
508 Flush(); | |
509 } | |
510 | |
511 DictionaryValue* SSLClientSocketPool::GetInfoAsValue( | 507 DictionaryValue* SSLClientSocketPool::GetInfoAsValue( |
512 const std::string& name, | 508 const std::string& name, |
513 const std::string& type, | 509 const std::string& type, |
514 bool include_nested_pools) const { | 510 bool include_nested_pools) const { |
515 DictionaryValue* dict = base_.GetInfoAsValue(name, type); | 511 DictionaryValue* dict = base_.GetInfoAsValue(name, type); |
516 if (include_nested_pools) { | 512 if (include_nested_pools) { |
517 ListValue* list = new ListValue(); | 513 ListValue* list = new ListValue(); |
518 if (tcp_pool_) { | 514 if (tcp_pool_) { |
519 list->Append(tcp_pool_->GetInfoAsValue("tcp_socket_pool", | 515 list->Append(tcp_pool_->GetInfoAsValue("tcp_socket_pool", |
520 "tcp_socket_pool", | 516 "tcp_socket_pool", |
(...skipping 15 matching lines...) Expand all Loading... |
536 } | 532 } |
537 | 533 |
538 base::TimeDelta SSLClientSocketPool::ConnectionTimeout() const { | 534 base::TimeDelta SSLClientSocketPool::ConnectionTimeout() const { |
539 return base_.ConnectionTimeout(); | 535 return base_.ConnectionTimeout(); |
540 } | 536 } |
541 | 537 |
542 ClientSocketPoolHistograms* SSLClientSocketPool::histograms() const { | 538 ClientSocketPoolHistograms* SSLClientSocketPool::histograms() const { |
543 return base_.histograms(); | 539 return base_.histograms(); |
544 } | 540 } |
545 | 541 |
| 542 void SSLClientSocketPool::OnSSLConfigChanged() { |
| 543 Flush(); |
| 544 } |
| 545 |
546 } // namespace net | 546 } // namespace net |
OLD | NEW |