| OLD | NEW |
| 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 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 void SSLConnectJob::GetAdditionalErrorState(ClientSocketHandle* handle) { | 157 void SSLConnectJob::GetAdditionalErrorState(ClientSocketHandle* handle) { |
| 158 // Headers in |error_response_info_| indicate a proxy tunnel setup | 158 // Headers in |error_response_info_| indicate a proxy tunnel setup |
| 159 // problem. See DoTunnelConnectComplete. | 159 // problem. See DoTunnelConnectComplete. |
| 160 if (error_response_info_.headers.get()) { | 160 if (error_response_info_.headers.get()) { |
| 161 handle->set_pending_http_proxy_connection( | 161 handle->set_pending_http_proxy_connection( |
| 162 transport_socket_handle_.release()); | 162 transport_socket_handle_.release()); |
| 163 } | 163 } |
| 164 handle->set_ssl_error_response_info(error_response_info_); | 164 handle->set_ssl_error_response_info(error_response_info_); |
| 165 if (!connect_timing_.ssl_start.is_null()) | 165 if (!connect_timing_.ssl_start.is_null()) |
| 166 handle->set_is_ssl_error(true); | 166 handle->set_is_ssl_error(true); |
| 167 |
| 168 handle->set_connection_attempts(connection_attempts_); |
| 167 } | 169 } |
| 168 | 170 |
| 169 void SSLConnectJob::OnIOComplete(int result) { | 171 void SSLConnectJob::OnIOComplete(int result) { |
| 170 int rv = DoLoop(result); | 172 int rv = DoLoop(result); |
| 171 if (rv != ERR_IO_PENDING) | 173 if (rv != ERR_IO_PENDING) |
| 172 NotifyDelegateOfCompletion(rv); // Deletes |this|. | 174 NotifyDelegateOfCompletion(rv); // Deletes |this|. |
| 173 } | 175 } |
| 174 | 176 |
| 175 int SSLConnectJob::DoLoop(int result) { | 177 int SSLConnectJob::DoLoop(int result) { |
| 176 DCHECK_NE(next_state_, STATE_NONE); | 178 DCHECK_NE(next_state_, STATE_NONE); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 | 225 |
| 224 next_state_ = STATE_TRANSPORT_CONNECT_COMPLETE; | 226 next_state_ = STATE_TRANSPORT_CONNECT_COMPLETE; |
| 225 transport_socket_handle_.reset(new ClientSocketHandle()); | 227 transport_socket_handle_.reset(new ClientSocketHandle()); |
| 226 scoped_refptr<TransportSocketParams> direct_params = | 228 scoped_refptr<TransportSocketParams> direct_params = |
| 227 params_->GetDirectConnectionParams(); | 229 params_->GetDirectConnectionParams(); |
| 228 return transport_socket_handle_->Init(group_name(), direct_params, priority(), | 230 return transport_socket_handle_->Init(group_name(), direct_params, priority(), |
| 229 callback_, transport_pool_, net_log()); | 231 callback_, transport_pool_, net_log()); |
| 230 } | 232 } |
| 231 | 233 |
| 232 int SSLConnectJob::DoTransportConnectComplete(int result) { | 234 int SSLConnectJob::DoTransportConnectComplete(int result) { |
| 233 if (result == OK) | 235 connection_attempts_ = transport_socket_handle_->connection_attempts(); |
| 236 if (result == OK) { |
| 234 next_state_ = STATE_SSL_CONNECT; | 237 next_state_ = STATE_SSL_CONNECT; |
| 238 transport_socket_handle_->socket()->GetPeerAddress(&direct_address_); |
| 239 } |
| 235 | 240 |
| 236 return result; | 241 return result; |
| 237 } | 242 } |
| 238 | 243 |
| 239 int SSLConnectJob::DoSOCKSConnect() { | 244 int SSLConnectJob::DoSOCKSConnect() { |
| 240 DCHECK(socks_pool_); | 245 DCHECK(socks_pool_); |
| 241 next_state_ = STATE_SOCKS_CONNECT_COMPLETE; | 246 next_state_ = STATE_SOCKS_CONNECT_COMPLETE; |
| 242 transport_socket_handle_.reset(new ClientSocketHandle()); | 247 transport_socket_handle_.reset(new ClientSocketHandle()); |
| 243 scoped_refptr<SOCKSSocketParams> socks_proxy_params = | 248 scoped_refptr<SOCKSSocketParams> socks_proxy_params = |
| 244 params_->GetSocksProxyConnectionParams(); | 249 params_->GetSocksProxyConnectionParams(); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 transport_socket_handle_.Pass(), | 320 transport_socket_handle_.Pass(), |
| 316 params_->host_and_port(), | 321 params_->host_and_port(), |
| 317 params_->ssl_config(), | 322 params_->ssl_config(), |
| 318 context_); | 323 context_); |
| 319 return ssl_socket_->Connect(callback_); | 324 return ssl_socket_->Connect(callback_); |
| 320 } | 325 } |
| 321 | 326 |
| 322 int SSLConnectJob::DoSSLConnectComplete(int result) { | 327 int SSLConnectJob::DoSSLConnectComplete(int result) { |
| 323 connect_timing_.ssl_end = base::TimeTicks::Now(); | 328 connect_timing_.ssl_end = base::TimeTicks::Now(); |
| 324 | 329 |
| 330 if (result != OK && !direct_address_.address().empty()) { |
| 331 connection_attempts_.push_back( |
| 332 ClientSocketHandle::ConnectionAttempt(direct_address_, result)); |
| 333 direct_address_ = IPEndPoint(); |
| 334 } |
| 335 |
| 325 SSLClientSocket::NextProtoStatus status = | 336 SSLClientSocket::NextProtoStatus status = |
| 326 SSLClientSocket::kNextProtoUnsupported; | 337 SSLClientSocket::kNextProtoUnsupported; |
| 327 std::string proto; | 338 std::string proto; |
| 328 // GetNextProto will fail and and trigger a NOTREACHED if we pass in a socket | 339 // GetNextProto will fail and and trigger a NOTREACHED if we pass in a socket |
| 329 // that hasn't had SSL_ImportFD called on it. If we get a certificate error | 340 // that hasn't had SSL_ImportFD called on it. If we get a certificate error |
| 330 // here, then we know that we called SSL_ImportFD. | 341 // here, then we know that we called SSL_ImportFD. |
| 331 if (result == OK || IsCertificateError(result)) { | 342 if (result == OK || IsCertificateError(result)) { |
| 332 status = ssl_socket_->GetNextProto(&proto); | 343 status = ssl_socket_->GetNextProto(&proto); |
| 333 ssl_socket_->RecordNegotiationExtension(); | 344 ssl_socket_->RecordNegotiationExtension(); |
| 334 } | 345 } |
| (...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 686 if (base_.CloseOneIdleSocket()) | 697 if (base_.CloseOneIdleSocket()) |
| 687 return true; | 698 return true; |
| 688 return base_.CloseOneIdleConnectionInHigherLayeredPool(); | 699 return base_.CloseOneIdleConnectionInHigherLayeredPool(); |
| 689 } | 700 } |
| 690 | 701 |
| 691 void SSLClientSocketPool::OnSSLConfigChanged() { | 702 void SSLClientSocketPool::OnSSLConfigChanged() { |
| 692 FlushWithError(ERR_NETWORK_CHANGED); | 703 FlushWithError(ERR_NETWORK_CHANGED); |
| 693 } | 704 } |
| 694 | 705 |
| 695 } // namespace net | 706 } // namespace net |
| OLD | NEW |