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