| Index: net/http/http_network_transaction.cc
|
| diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc
|
| index 64a4fa7985669de75c1ef7c7a02d99f23602c1cf..263ad7b3dfd70221f448220db19ddc3f4882e3ea 100644
|
| --- a/net/http/http_network_transaction.cc
|
| +++ b/net/http/http_network_transaction.cc
|
| @@ -554,6 +554,10 @@ int HttpNetworkTransaction::DoCreateStreamComplete(int result) {
|
| return OK;
|
| }
|
|
|
| + // Handle possible handshake errors that may have occurred if the stream
|
| + // used SSL for one or more of the layers.
|
| + result = HandleSSLHandshakeError(result);
|
| +
|
| // At this point we are done with the stream_request_.
|
| stream_request_.reset();
|
| return result;
|
| @@ -696,23 +700,6 @@ int HttpNetworkTransaction::DoReadHeadersComplete(int result) {
|
| result = HandleCertificateRequest(result);
|
| if (result == OK)
|
| return result;
|
| - } else if ((result == ERR_SSL_DECOMPRESSION_FAILURE_ALERT ||
|
| - result == ERR_SSL_BAD_RECORD_MAC_ALERT) &&
|
| - ssl_config_.tls1_enabled &&
|
| - !SSLConfigService::IsKnownStrictTLSServer(request_->url.host())) {
|
| - // Some buggy servers select DEFLATE compression when offered and then
|
| - // fail to ever decompress anything. They will send a fatal alert telling
|
| - // us this. Normally we would pick this up during the handshake because
|
| - // our Finished message is compressed and we'll never get the server's
|
| - // Finished if it fails to process ours.
|
| - //
|
| - // However, with False Start, we'll believe that the handshake is
|
| - // complete as soon as we've /sent/ our Finished message. In this case,
|
| - // we only find out that the server is buggy here, when we try to read
|
| - // the initial reply.
|
| - session_->http_stream_factory()->AddTLSIntolerantServer(request_->url);
|
| - ResetConnectionAndRequestForResend();
|
| - return OK;
|
| }
|
|
|
| if (result < 0 && result != ERR_CONNECTION_CLOSED)
|
| @@ -1024,11 +1011,45 @@ int HttpNetworkTransaction::HandleCertificateRequest(int error) {
|
| return OK;
|
| }
|
|
|
| +// TODO(rch): This does not currently handle errors when an SSL proxy is
|
| +// being used (http://crbug.com/66424)
|
| +int HttpNetworkTransaction::HandleSSLHandshakeError(int error) {
|
| + DCHECK(request_);
|
| + if (ssl_config_.send_client_cert &&
|
| + (error == ERR_SSL_PROTOCOL_ERROR ||
|
| + error == ERR_BAD_SSL_CLIENT_AUTH_CERT)) {
|
| + session_->ssl_client_auth_cache()->Remove(
|
| + GetHostAndPort(request_->url));
|
| + }
|
| +
|
| + switch (error) {
|
| + case ERR_SSL_PROTOCOL_ERROR:
|
| + case ERR_SSL_VERSION_OR_CIPHER_MISMATCH:
|
| + case ERR_SSL_DECOMPRESSION_FAILURE_ALERT:
|
| + case ERR_SSL_BAD_RECORD_MAC_ALERT:
|
| + if (ssl_config_.tls1_enabled &&
|
| + !SSLConfigService::IsKnownStrictTLSServer(request_->url.host())) {
|
| + // This could be a TLS-intolerant server, an SSL 3.0 server that
|
| + // chose a TLS-only cipher suite or a server with buggy DEFLATE
|
| + // support. Turn off TLS 1.0, DEFLATE support and retry.
|
| + session_->http_stream_factory()->AddTLSIntolerantServer(request_->url);
|
| + ResetConnectionAndRequestForResend();
|
| + error = OK;
|
| + }
|
| + break;
|
| + }
|
| + return error;
|
| +}
|
| +
|
| // This method determines whether it is safe to resend the request after an
|
| // IO error. It can only be called in response to request header or body
|
| // write errors or response header read errors. It should not be used in
|
| // other cases, such as a Connect error.
|
| int HttpNetworkTransaction::HandleIOError(int error) {
|
| + // Handle possible SSL handshake errors that may occur during send/receive
|
| + // due to either False Start or Snap Start.
|
| + error = HandleSSLHandshakeError(error);
|
| +
|
| switch (error) {
|
| // If we try to reuse a connection that the server is in the process of
|
| // closing, we may end up successfully writing out our request (or a
|
|
|