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/http/http_network_transaction.h" | 5 #include "net/http/http_network_transaction.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
(...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
547 next_state_ = STATE_INIT_STREAM; | 547 next_state_ = STATE_INIT_STREAM; |
548 DCHECK(stream_.get()); | 548 DCHECK(stream_.get()); |
549 } else if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) { | 549 } else if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) { |
550 result = HandleCertificateRequest(result); | 550 result = HandleCertificateRequest(result); |
551 } else if (result == ERR_HTTPS_PROXY_TUNNEL_RESPONSE) { | 551 } else if (result == ERR_HTTPS_PROXY_TUNNEL_RESPONSE) { |
552 // Return OK and let the caller read the proxy's error page | 552 // Return OK and let the caller read the proxy's error page |
553 next_state_ = STATE_NONE; | 553 next_state_ = STATE_NONE; |
554 return OK; | 554 return OK; |
555 } | 555 } |
556 | 556 |
557 // Handle possible handshake errors that may have occurred if the stream | |
558 // used SSL for one or more of the layers. | |
559 result = HandleSSLHandshakeError(result); | |
560 | |
557 // At this point we are done with the stream_request_. | 561 // At this point we are done with the stream_request_. |
558 stream_request_.reset(); | 562 stream_request_.reset(); |
559 return result; | 563 return result; |
560 } | 564 } |
561 | 565 |
562 int HttpNetworkTransaction::DoInitStream() { | 566 int HttpNetworkTransaction::DoInitStream() { |
563 DCHECK(stream_.get()); | 567 DCHECK(stream_.get()); |
564 next_state_ = STATE_INIT_STREAM_COMPLETE; | 568 next_state_ = STATE_INIT_STREAM_COMPLETE; |
565 return stream_->InitializeStream(request_, net_log_, &io_callback_); | 569 return stream_->InitializeStream(request_, net_log_, &io_callback_); |
566 } | 570 } |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
689 result = ERR_CERT_ERROR_IN_SSL_RENEGOTIATION; | 693 result = ERR_CERT_ERROR_IN_SSL_RENEGOTIATION; |
690 } else if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) { | 694 } else if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) { |
691 // TODO(wtc): Need a test case for this code path! | 695 // TODO(wtc): Need a test case for this code path! |
692 DCHECK(stream_.get()); | 696 DCHECK(stream_.get()); |
693 DCHECK(is_https_request()); | 697 DCHECK(is_https_request()); |
694 response_.cert_request_info = new SSLCertRequestInfo; | 698 response_.cert_request_info = new SSLCertRequestInfo; |
695 stream_->GetSSLCertRequestInfo(response_.cert_request_info); | 699 stream_->GetSSLCertRequestInfo(response_.cert_request_info); |
696 result = HandleCertificateRequest(result); | 700 result = HandleCertificateRequest(result); |
697 if (result == OK) | 701 if (result == OK) |
698 return result; | 702 return result; |
699 } else if ((result == ERR_SSL_DECOMPRESSION_FAILURE_ALERT || | |
700 result == ERR_SSL_BAD_RECORD_MAC_ALERT) && | |
701 ssl_config_.tls1_enabled && | |
702 !SSLConfigService::IsKnownStrictTLSServer(request_->url.host())) { | |
703 // Some buggy servers select DEFLATE compression when offered and then | |
704 // fail to ever decompress anything. They will send a fatal alert telling | |
705 // us this. Normally we would pick this up during the handshake because | |
706 // our Finished message is compressed and we'll never get the server's | |
707 // Finished if it fails to process ours. | |
708 // | |
709 // However, with False Start, we'll believe that the handshake is | |
710 // complete as soon as we've /sent/ our Finished message. In this case, | |
711 // we only find out that the server is buggy here, when we try to read | |
712 // the initial reply. | |
713 session_->http_stream_factory()->AddTLSIntolerantServer(request_->url); | |
714 ResetConnectionAndRequestForResend(); | |
715 return OK; | |
716 } | 703 } |
717 | 704 |
718 if (result < 0 && result != ERR_CONNECTION_CLOSED) | 705 if (result < 0 && result != ERR_CONNECTION_CLOSED) |
719 return HandleIOError(result); | 706 return HandleIOError(result); |
720 | 707 |
721 if (result == ERR_CONNECTION_CLOSED && ShouldResendRequest(result)) { | 708 if (result == ERR_CONNECTION_CLOSED && ShouldResendRequest(result)) { |
722 ResetConnectionAndRequestForResend(); | 709 ResetConnectionAndRequestForResend(); |
723 return OK; | 710 return OK; |
724 } | 711 } |
725 | 712 |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1017 // SSL session cache. | 1004 // SSL session cache. |
1018 ssl_config_.client_cert = client_cert; | 1005 ssl_config_.client_cert = client_cert; |
1019 ssl_config_.send_client_cert = true; | 1006 ssl_config_.send_client_cert = true; |
1020 next_state_ = STATE_CREATE_STREAM; | 1007 next_state_ = STATE_CREATE_STREAM; |
1021 // Reset the other member variables. | 1008 // Reset the other member variables. |
1022 // Note: this is necessary only with SSL renegotiation. | 1009 // Note: this is necessary only with SSL renegotiation. |
1023 ResetStateForRestart(); | 1010 ResetStateForRestart(); |
1024 return OK; | 1011 return OK; |
1025 } | 1012 } |
1026 | 1013 |
1014 // TODO(rch): This does not currently handle errors when an SSL proxy is | |
1015 // being used (http://crbug.com/66424) | |
wtc
2011/01/10 23:40:58
You should point out what the issue is. I believe
| |
1016 int HttpNetworkTransaction::HandleSSLHandshakeError(int error) { | |
1017 DCHECK(request_); | |
1018 if (ssl_config_.send_client_cert && | |
1019 (error == ERR_SSL_PROTOCOL_ERROR || | |
1020 error == ERR_BAD_SSL_CLIENT_AUTH_CERT)) { | |
1021 session_->ssl_client_auth_cache()->Remove( | |
1022 GetHostAndPort(request_->url)); | |
1023 } | |
1024 | |
1025 switch (error) { | |
1026 case ERR_SSL_PROTOCOL_ERROR: | |
1027 case ERR_SSL_VERSION_OR_CIPHER_MISMATCH: | |
1028 case ERR_SSL_DECOMPRESSION_FAILURE_ALERT: | |
1029 case ERR_SSL_BAD_RECORD_MAC_ALERT: | |
1030 if (ssl_config_.tls1_enabled && | |
1031 !SSLConfigService::IsKnownStrictTLSServer(request_->url.host())) { | |
1032 // This could be a TLS-intolerant server, an SSL 3.0 server that | |
1033 // chose a TLS-only cipher suite or a server with buggy DEFLATE | |
1034 // support. Turn off TLS 1.0, DEFLATE support and retry. | |
1035 session_->http_stream_factory()->AddTLSIntolerantServer(request_->url); | |
1036 ResetConnectionAndRequestForResend(); | |
1037 error = OK; | |
1038 } | |
1039 break; | |
1040 } | |
1041 return error; | |
1042 } | |
1043 | |
1027 // This method determines whether it is safe to resend the request after an | 1044 // This method determines whether it is safe to resend the request after an |
1028 // IO error. It can only be called in response to request header or body | 1045 // IO error. It can only be called in response to request header or body |
1029 // write errors or response header read errors. It should not be used in | 1046 // write errors or response header read errors. It should not be used in |
1030 // other cases, such as a Connect error. | 1047 // other cases, such as a Connect error. |
1031 int HttpNetworkTransaction::HandleIOError(int error) { | 1048 int HttpNetworkTransaction::HandleIOError(int error) { |
wtc
2011/01/10 23:40:58
1. Having HandleIOError call HandleSSLHandshakeErr
Ryan Sleevi
2011/01/11 01:37:47
If IO can happen, then a check for SSL errors need
| |
1049 // Handle possible SSL handshake errors that may occur during send/receive | |
1050 // due to either False Start or Snap Start. | |
1051 error = HandleSSLHandshakeError(error); | |
1052 | |
1032 switch (error) { | 1053 switch (error) { |
1033 // If we try to reuse a connection that the server is in the process of | 1054 // If we try to reuse a connection that the server is in the process of |
1034 // closing, we may end up successfully writing out our request (or a | 1055 // closing, we may end up successfully writing out our request (or a |
1035 // portion of our request) only to find a connection error when we try to | 1056 // portion of our request) only to find a connection error when we try to |
1036 // read from (or finish writing to) the socket. | 1057 // read from (or finish writing to) the socket. |
1037 case ERR_CONNECTION_RESET: | 1058 case ERR_CONNECTION_RESET: |
1038 case ERR_CONNECTION_CLOSED: | 1059 case ERR_CONNECTION_CLOSED: |
1039 case ERR_CONNECTION_ABORTED: | 1060 case ERR_CONNECTION_ABORTED: |
1040 if (ShouldResendRequest(error)) { | 1061 if (ShouldResendRequest(error)) { |
1041 ResetConnectionAndRequestForResend(); | 1062 ResetConnectionAndRequestForResend(); |
1042 error = OK; | 1063 error = OK; |
1043 } | 1064 } |
1044 break; | 1065 break; |
1045 case ERR_SSL_SNAP_START_NPN_MISPREDICTION: | 1066 case ERR_SSL_SNAP_START_NPN_MISPREDICTION: |
wtc
2011/01/10 23:40:58
Please move this case into HandleSSLHandshakeError
| |
1046 // This means that we tried to Snap Start a connection, but we | 1067 // This means that we tried to Snap Start a connection, but we |
1047 // mispredicted the NPN result. This isn't a problem from the point of | 1068 // mispredicted the NPN result. This isn't a problem from the point of |
1048 // view of the SSL layer because the server will ignore the application | 1069 // view of the SSL layer because the server will ignore the application |
1049 // data in the Snap Start extension. However, at the HTTP layer, we have | 1070 // data in the Snap Start extension. However, at the HTTP layer, we have |
1050 // already decided that it's a HTTP or SPDY connection and it's easier to | 1071 // already decided that it's a HTTP or SPDY connection and it's easier to |
1051 // abort and start again. | 1072 // abort and start again. |
1052 ResetConnectionAndRequestForResend(); | 1073 ResetConnectionAndRequestForResend(); |
1053 error = OK; | 1074 error = OK; |
1054 break; | 1075 break; |
1055 } | 1076 } |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1203 default: | 1224 default: |
1204 return priority; | 1225 return priority; |
1205 } | 1226 } |
1206 } | 1227 } |
1207 | 1228 |
1208 | 1229 |
1209 | 1230 |
1210 #undef STATE_CASE | 1231 #undef STATE_CASE |
1211 | 1232 |
1212 } // namespace net | 1233 } // namespace net |
OLD | NEW |