Chromium Code Reviews| 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 correctly handle errors when an SSL proxy is | |
| 1015 // being used, as all of the errors are handled as if they were generated | |
| 1016 // by the endpoint host, request_->url, rather than considering if they were | |
| 1017 // generated by the SSL proxy. http://crbug.com/66424 | |
| 1018 int HttpNetworkTransaction::HandleSSLHandshakeError(int error) { | |
| 1019 DCHECK(request_); | |
| 1020 if (ssl_config_.send_client_cert && | |
| 1021 (error == ERR_SSL_PROTOCOL_ERROR || | |
| 1022 error == ERR_BAD_SSL_CLIENT_AUTH_CERT)) { | |
| 1023 session_->ssl_client_auth_cache()->Remove( | |
| 1024 GetHostAndPort(request_->url)); | |
| 1025 } | |
| 1026 | |
| 1027 switch (error) { | |
| 1028 case ERR_SSL_PROTOCOL_ERROR: | |
| 1029 case ERR_SSL_VERSION_OR_CIPHER_MISMATCH: | |
| 1030 case ERR_SSL_DECOMPRESSION_FAILURE_ALERT: | |
| 1031 case ERR_SSL_BAD_RECORD_MAC_ALERT: | |
| 1032 if (ssl_config_.tls1_enabled && | |
| 1033 !SSLConfigService::IsKnownStrictTLSServer(request_->url.host())) { | |
| 1034 // This could be a TLS-intolerant server, an SSL 3.0 server that | |
| 1035 // chose a TLS-only cipher suite or a server with buggy DEFLATE | |
| 1036 // support. Turn off TLS 1.0, DEFLATE support and retry. | |
| 1037 session_->http_stream_factory()->AddTLSIntolerantServer(request_->url); | |
| 1038 ResetConnectionAndRequestForResend(); | |
| 1039 error = OK; | |
| 1040 } | |
| 1041 break; | |
| 1042 case ERR_SSL_SNAP_START_NPN_MISPREDICTION: | |
| 1043 // This means that we tried to Snap Start a connection, but we | |
| 1044 // mispredicted the NPN result. This isn't a problem from the point of | |
| 1045 // view of the SSL layer because the server will ignore the application | |
| 1046 // data in the Snap Start extension. However, at the HTTP layer, we have | |
| 1047 // already decided that it's a HTTP or SPDY connection and it's easier to | |
| 1048 // abort and start again. | |
| 1049 ResetConnectionAndRequestForResend(); | |
| 1050 error = OK; | |
| 1051 break; | |
| 1052 } | |
| 1053 return error; | |
| 1054 } | |
| 1055 | |
| 1027 // This method determines whether it is safe to resend the request after an | 1056 // 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 | 1057 // 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 | 1058 // write errors or response header read errors. It should not be used in |
| 1030 // other cases, such as a Connect error. | 1059 // other cases, such as a Connect error. |
| 1031 int HttpNetworkTransaction::HandleIOError(int error) { | 1060 int HttpNetworkTransaction::HandleIOError(int error) { |
| 1061 // SSL errors may happen at any time during the stream and indicate issues | |
| 1062 // with the underlying connection. Because the peer may request | |
| 1063 // renegotiation at any time, check and handle any possible SSL handshake | |
| 1064 // related errors. In addition to renegotiation, TLS False/Snap Start may | |
| 1065 // cause SSL handshake errors to be delayed until the first Read on the | |
|
wtc
2011/01/12 00:21:09
This should be "first Write or Read", right?
| |
| 1066 // underlying connection. | |
| 1067 error = HandleSSLHandshakeError(error); | |
| 1068 | |
| 1032 switch (error) { | 1069 switch (error) { |
| 1033 // If we try to reuse a connection that the server is in the process of | 1070 // 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 | 1071 // 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 | 1072 // portion of our request) only to find a connection error when we try to |
| 1036 // read from (or finish writing to) the socket. | 1073 // read from (or finish writing to) the socket. |
| 1037 case ERR_CONNECTION_RESET: | 1074 case ERR_CONNECTION_RESET: |
| 1038 case ERR_CONNECTION_CLOSED: | 1075 case ERR_CONNECTION_CLOSED: |
| 1039 case ERR_CONNECTION_ABORTED: | 1076 case ERR_CONNECTION_ABORTED: |
| 1040 if (ShouldResendRequest(error)) { | 1077 if (ShouldResendRequest(error)) { |
| 1041 ResetConnectionAndRequestForResend(); | 1078 ResetConnectionAndRequestForResend(); |
| 1042 error = OK; | 1079 error = OK; |
| 1043 } | 1080 } |
| 1044 break; | 1081 break; |
| 1045 case ERR_SSL_SNAP_START_NPN_MISPREDICTION: | |
| 1046 // 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 | |
| 1048 // 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 | |
| 1050 // already decided that it's a HTTP or SPDY connection and it's easier to | |
| 1051 // abort and start again. | |
| 1052 ResetConnectionAndRequestForResend(); | |
| 1053 error = OK; | |
| 1054 break; | |
| 1055 } | 1082 } |
| 1056 return error; | 1083 return error; |
| 1057 } | 1084 } |
| 1058 | 1085 |
| 1059 void HttpNetworkTransaction::ResetStateForRestart() { | 1086 void HttpNetworkTransaction::ResetStateForRestart() { |
| 1060 ResetStateForAuthRestart(); | 1087 ResetStateForAuthRestart(); |
| 1061 stream_.reset(); | 1088 stream_.reset(); |
| 1062 } | 1089 } |
| 1063 | 1090 |
| 1064 void HttpNetworkTransaction::ResetStateForAuthRestart() { | 1091 void HttpNetworkTransaction::ResetStateForAuthRestart() { |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1203 default: | 1230 default: |
| 1204 return priority; | 1231 return priority; |
| 1205 } | 1232 } |
| 1206 } | 1233 } |
| 1207 | 1234 |
| 1208 | 1235 |
| 1209 | 1236 |
| 1210 #undef STATE_CASE | 1237 #undef STATE_CASE |
| 1211 | 1238 |
| 1212 } // namespace net | 1239 } // namespace net |
| OLD | NEW |