Index: net/http/http_network_transaction.cc |
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc |
index 9bf323d99c9a1599c3c20b28d5cf48e545af29bc..41bc8fbb9cbaadd796b83379b26a214a22e004d0 100644 |
--- a/net/http/http_network_transaction.cc |
+++ b/net/http/http_network_transaction.cc |
@@ -786,6 +786,8 @@ int HttpNetworkTransaction::DoCreateStreamComplete(int result) { |
CopyConnectionAttemptsFromStreamRequest(); |
if (result == OK) { |
+ if (request_->url.SchemeIsCryptographic()) |
+ RecordSSLFallbackMetrics(); |
next_state_ = STATE_INIT_STREAM; |
DCHECK(stream_.get()); |
} else if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) { |
@@ -1530,6 +1532,49 @@ void HttpNetworkTransaction::ResetStateForAuthRestart() { |
establishing_tunnel_ = false; |
} |
+void HttpNetworkTransaction::RecordSSLFallbackMetrics() { |
+ // Note: these values are used in histograms, so new values must be appended. |
+ enum FallbackVersion { |
+ FALLBACK_NONE = 0, // SSL version fallback did not occur. |
+ FALLBACK_SSL3 = 1, // Fell back to SSL 3.0. |
+ FALLBACK_TLS1 = 2, // Fell back to TLS 1.0. |
+ FALLBACK_TLS1_1 = 3, // Fell back to TLS 1.1. |
+ FALLBACK_MAX, |
+ }; |
+ |
+ FallbackVersion fallback = FALLBACK_NONE; |
+ if (server_ssl_config_.version_fallback) { |
+ switch (server_ssl_config_.version_max) { |
+ case SSL_PROTOCOL_VERSION_SSL3: |
+ fallback = FALLBACK_SSL3; |
+ break; |
+ case SSL_PROTOCOL_VERSION_TLS1: |
+ fallback = FALLBACK_TLS1; |
+ break; |
+ case SSL_PROTOCOL_VERSION_TLS1_1: |
+ fallback = FALLBACK_TLS1_1; |
+ break; |
+ default: |
+ NOTREACHED(); |
+ } |
+ } |
+ UMA_HISTOGRAM_ENUMERATION("Net.ConnectionUsedSSLVersionFallback2", fallback, |
+ FALLBACK_MAX); |
+ |
+ // Google servers are known to implement TLS 1.2 and FALLBACK_SCSV, so it |
+ // should be impossible to successfully connect to them with the fallback. |
+ // This helps estimate intolerant locally-configured SSL MITMs. |
+ const std::string& host = request_->url.host(); |
+ if (EndsWith(host, "google.com", true) && |
+ (host.size() == 10 || host[host.size() - 11] == '.')) { |
+ UMA_HISTOGRAM_ENUMERATION("Net.GoogleConnectionUsedSSLVersionFallback2", |
+ fallback, FALLBACK_MAX); |
+ } |
+ |
+ UMA_HISTOGRAM_BOOLEAN("Net.ConnectionUsedSSLDeprecatedCipherFallback2", |
+ server_ssl_config_.enable_deprecated_cipher_suites); |
+} |
+ |
HttpResponseHeaders* HttpNetworkTransaction::GetResponseHeaders() const { |
return response_.headers.get(); |
} |