| Index: net/http/http_network_transaction.cc
|
| diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc
|
| index 981fcb6abb003efef8362d272967df28d96309e0..8fd0595cf47d824727bf4a0c48ef2c74aeb579e8 100644
|
| --- a/net/http/http_network_transaction.cc
|
| +++ b/net/http/http_network_transaction.cc
|
| @@ -95,12 +95,14 @@ void ProcessAlternateProtocol(
|
| base::Value* NetLogSSLVersionFallbackCallback(
|
| const GURL* url,
|
| int net_error,
|
| + SSLFailureState ssl_failure_state,
|
| uint16 version_before,
|
| uint16 version_after,
|
| NetLogCaptureMode /* capture_mode */) {
|
| base::DictionaryValue* dict = new base::DictionaryValue();
|
| dict->SetString("host_and_port", GetHostAndPort(*url));
|
| dict->SetInteger("net_error", net_error);
|
| + dict->SetInteger("ssl_failure_state", ssl_failure_state);
|
| dict->SetInteger("version_before", version_before);
|
| dict->SetInteger("version_after", version_after);
|
| return dict;
|
| @@ -129,7 +131,9 @@ HttpNetworkTransaction::HttpNetworkTransaction(RequestPriority priority,
|
| request_(NULL),
|
| priority_(priority),
|
| headers_valid_(false),
|
| + server_ssl_failure_state_(kSSLFailureNone),
|
| fallback_error_code_(ERR_SSL_INAPPROPRIATE_FALLBACK),
|
| + fallback_failure_state_(kSSLFailureNone),
|
| request_headers_(),
|
| read_buf_len_(0),
|
| total_received_bytes_(0),
|
| @@ -502,12 +506,14 @@ void HttpNetworkTransaction::OnWebSocketHandshakeStreamReady(
|
| }
|
|
|
| void HttpNetworkTransaction::OnStreamFailed(int result,
|
| - const SSLConfig& used_ssl_config) {
|
| + const SSLConfig& used_ssl_config,
|
| + SSLFailureState ssl_failure_state) {
|
| DCHECK_EQ(STATE_CREATE_STREAM_COMPLETE, next_state_);
|
| DCHECK_NE(OK, result);
|
| DCHECK(stream_request_.get());
|
| DCHECK(!stream_.get());
|
| server_ssl_config_ = used_ssl_config;
|
| + server_ssl_failure_state_ = ssl_failure_state;
|
|
|
| OnIOComplete(result);
|
| }
|
| @@ -1351,10 +1357,11 @@ int HttpNetworkTransaction::HandleSSLHandshakeError(int error) {
|
| if (should_fallback) {
|
| net_log_.AddEvent(
|
| NetLog::TYPE_SSL_VERSION_FALLBACK,
|
| - base::Bind(&NetLogSSLVersionFallbackCallback,
|
| - &request_->url, error, server_ssl_config_.version_max,
|
| + base::Bind(&NetLogSSLVersionFallbackCallback, &request_->url, error,
|
| + server_ssl_failure_state_, server_ssl_config_.version_max,
|
| version_max));
|
| fallback_error_code_ = error;
|
| + fallback_failure_state_ = server_ssl_failure_state_;
|
| server_ssl_config_.version_max = version_max;
|
| server_ssl_config_.version_fallback = true;
|
| ResetConnectionAndRequestForResend();
|
| @@ -1473,6 +1480,16 @@ void HttpNetworkTransaction::RecordSSLFallbackMetrics() {
|
|
|
| UMA_HISTOGRAM_BOOLEAN("Net.ConnectionUsedSSLDeprecatedCipherFallback2",
|
| server_ssl_config_.enable_deprecated_cipher_suites);
|
| +
|
| + if (server_ssl_config_.version_fallback) {
|
| + // Record the error code which triggered the fallback and the state the
|
| + // handshake was in.
|
| + UMA_HISTOGRAM_CUSTOM_ENUMERATION("Net.SSLFallbackErrorCode",
|
| + -fallback_error_code_,
|
| + net::GetAllErrorCodesForUma());
|
| + UMA_HISTOGRAM_ENUMERATION("Net.SSLFallbackFailureState",
|
| + fallback_failure_state_, kSSLFailureMax);
|
| + }
|
| }
|
|
|
| HttpResponseHeaders* HttpNetworkTransaction::GetResponseHeaders() const {
|
|
|