| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/bind.h" | 10 #include "base/bind.h" |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 case ERR_BAD_SSL_CLIENT_AUTH_CERT: | 86 case ERR_BAD_SSL_CLIENT_AUTH_CERT: |
| 87 case ERR_SSL_CLIENT_AUTH_PRIVATE_KEY_ACCESS_DENIED: | 87 case ERR_SSL_CLIENT_AUTH_PRIVATE_KEY_ACCESS_DENIED: |
| 88 case ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY: | 88 case ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY: |
| 89 case ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED: | 89 case ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED: |
| 90 return true; | 90 return true; |
| 91 default: | 91 default: |
| 92 return false; | 92 return false; |
| 93 } | 93 } |
| 94 } | 94 } |
| 95 | 95 |
| 96 class SSLVersionFallbackParams : public NetLog::EventParameters { | 96 Value* NetLogSSLVersionFallbackCallback(const GURL* url, |
| 97 public: | 97 int net_error, |
| 98 SSLVersionFallbackParams(const std::string& host_and_port, | 98 uint16 version_before, |
| 99 int net_error, | 99 uint16 version_after, |
| 100 uint16 version_before, | 100 NetLog::LogLevel /* log_level */) { |
| 101 uint16 version_after) | 101 DictionaryValue* dict = new DictionaryValue(); |
| 102 : host_and_port_(host_and_port), | 102 dict->SetString("host_and_port", GetHostAndPort(*url)); |
| 103 net_error_(net_error), | 103 dict->SetInteger("net_error", net_error); |
| 104 version_before_(version_before), | 104 dict->SetInteger("version_before", version_before); |
| 105 version_after_(version_after) { | 105 dict->SetInteger("version_after", version_after); |
| 106 } | 106 return dict; |
| 107 | 107 } |
| 108 virtual Value* ToValue() const { | |
| 109 DictionaryValue* dict = new DictionaryValue(); | |
| 110 dict->SetString("host_and_port", host_and_port_); | |
| 111 dict->SetInteger("net_error", net_error_); | |
| 112 dict->SetInteger("version_before", version_before_); | |
| 113 dict->SetInteger("version_after", version_after_); | |
| 114 return dict; | |
| 115 } | |
| 116 | |
| 117 protected: | |
| 118 virtual ~SSLVersionFallbackParams() {} | |
| 119 | |
| 120 private: | |
| 121 const std::string host_and_port_; | |
| 122 const int net_error_; // Network error code that caused the fallback. | |
| 123 const uint16 version_before_; // SSL version before the fallback. | |
| 124 const uint16 version_after_; // SSL version after the fallback. | |
| 125 }; | |
| 126 | 108 |
| 127 } // namespace | 109 } // namespace |
| 128 | 110 |
| 129 //----------------------------------------------------------------------------- | 111 //----------------------------------------------------------------------------- |
| 130 | 112 |
| 131 HttpNetworkTransaction::HttpNetworkTransaction(HttpNetworkSession* session) | 113 HttpNetworkTransaction::HttpNetworkTransaction(HttpNetworkSession* session) |
| 132 : pending_auth_target_(HttpAuth::AUTH_NONE), | 114 : pending_auth_target_(HttpAuth::AUTH_NONE), |
| 133 ALLOW_THIS_IN_INITIALIZER_LIST(io_callback_( | 115 ALLOW_THIS_IN_INITIALIZER_LIST(io_callback_( |
| 134 base::Bind(&HttpNetworkTransaction::OnIOComplete, | 116 base::Bind(&HttpNetworkTransaction::OnIOComplete, |
| 135 base::Unretained(this)))), | 117 base::Unretained(this)))), |
| (...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 547 break; | 529 break; |
| 548 case STATE_GENERATE_SERVER_AUTH_TOKEN: | 530 case STATE_GENERATE_SERVER_AUTH_TOKEN: |
| 549 DCHECK_EQ(OK, rv); | 531 DCHECK_EQ(OK, rv); |
| 550 rv = DoGenerateServerAuthToken(); | 532 rv = DoGenerateServerAuthToken(); |
| 551 break; | 533 break; |
| 552 case STATE_GENERATE_SERVER_AUTH_TOKEN_COMPLETE: | 534 case STATE_GENERATE_SERVER_AUTH_TOKEN_COMPLETE: |
| 553 rv = DoGenerateServerAuthTokenComplete(rv); | 535 rv = DoGenerateServerAuthTokenComplete(rv); |
| 554 break; | 536 break; |
| 555 case STATE_BUILD_REQUEST: | 537 case STATE_BUILD_REQUEST: |
| 556 DCHECK_EQ(OK, rv); | 538 DCHECK_EQ(OK, rv); |
| 557 net_log_.BeginEvent(NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST, NULL); | 539 net_log_.BeginEvent(NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST); |
| 558 rv = DoBuildRequest(); | 540 rv = DoBuildRequest(); |
| 559 break; | 541 break; |
| 560 case STATE_BUILD_REQUEST_COMPLETE: | 542 case STATE_BUILD_REQUEST_COMPLETE: |
| 561 rv = DoBuildRequestComplete(rv); | 543 rv = DoBuildRequestComplete(rv); |
| 562 break; | 544 break; |
| 563 case STATE_SEND_REQUEST: | 545 case STATE_SEND_REQUEST: |
| 564 DCHECK_EQ(OK, rv); | 546 DCHECK_EQ(OK, rv); |
| 565 rv = DoSendRequest(); | 547 rv = DoSendRequest(); |
| 566 break; | 548 break; |
| 567 case STATE_SEND_REQUEST_COMPLETE: | 549 case STATE_SEND_REQUEST_COMPLETE: |
| 568 rv = DoSendRequestComplete(rv); | 550 rv = DoSendRequestComplete(rv); |
| 569 net_log_.EndEventWithNetErrorCode( | 551 net_log_.EndEventWithNetErrorCode( |
| 570 NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST, rv); | 552 NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST, rv); |
| 571 break; | 553 break; |
| 572 case STATE_READ_HEADERS: | 554 case STATE_READ_HEADERS: |
| 573 DCHECK_EQ(OK, rv); | 555 DCHECK_EQ(OK, rv); |
| 574 net_log_.BeginEvent(NetLog::TYPE_HTTP_TRANSACTION_READ_HEADERS, NULL); | 556 net_log_.BeginEvent(NetLog::TYPE_HTTP_TRANSACTION_READ_HEADERS); |
| 575 rv = DoReadHeaders(); | 557 rv = DoReadHeaders(); |
| 576 break; | 558 break; |
| 577 case STATE_READ_HEADERS_COMPLETE: | 559 case STATE_READ_HEADERS_COMPLETE: |
| 578 rv = DoReadHeadersComplete(rv); | 560 rv = DoReadHeadersComplete(rv); |
| 579 net_log_.EndEventWithNetErrorCode( | 561 net_log_.EndEventWithNetErrorCode( |
| 580 NetLog::TYPE_HTTP_TRANSACTION_READ_HEADERS, rv); | 562 NetLog::TYPE_HTTP_TRANSACTION_READ_HEADERS, rv); |
| 581 break; | 563 break; |
| 582 case STATE_READ_BODY: | 564 case STATE_READ_BODY: |
| 583 DCHECK_EQ(OK, rv); | 565 DCHECK_EQ(OK, rv); |
| 584 net_log_.BeginEvent(NetLog::TYPE_HTTP_TRANSACTION_READ_BODY, NULL); | 566 net_log_.BeginEvent(NetLog::TYPE_HTTP_TRANSACTION_READ_BODY); |
| 585 rv = DoReadBody(); | 567 rv = DoReadBody(); |
| 586 break; | 568 break; |
| 587 case STATE_READ_BODY_COMPLETE: | 569 case STATE_READ_BODY_COMPLETE: |
| 588 rv = DoReadBodyComplete(rv); | 570 rv = DoReadBodyComplete(rv); |
| 589 net_log_.EndEventWithNetErrorCode( | 571 net_log_.EndEventWithNetErrorCode( |
| 590 NetLog::TYPE_HTTP_TRANSACTION_READ_BODY, rv); | 572 NetLog::TYPE_HTTP_TRANSACTION_READ_BODY, rv); |
| 591 break; | 573 break; |
| 592 case STATE_DRAIN_BODY_FOR_AUTH_RESTART: | 574 case STATE_DRAIN_BODY_FOR_AUTH_RESTART: |
| 593 DCHECK_EQ(OK, rv); | 575 DCHECK_EQ(OK, rv); |
| 594 net_log_.BeginEvent( | 576 net_log_.BeginEvent( |
| 595 NetLog::TYPE_HTTP_TRANSACTION_DRAIN_BODY_FOR_AUTH_RESTART, NULL); | 577 NetLog::TYPE_HTTP_TRANSACTION_DRAIN_BODY_FOR_AUTH_RESTART); |
| 596 rv = DoDrainBodyForAuthRestart(); | 578 rv = DoDrainBodyForAuthRestart(); |
| 597 break; | 579 break; |
| 598 case STATE_DRAIN_BODY_FOR_AUTH_RESTART_COMPLETE: | 580 case STATE_DRAIN_BODY_FOR_AUTH_RESTART_COMPLETE: |
| 599 rv = DoDrainBodyForAuthRestartComplete(rv); | 581 rv = DoDrainBodyForAuthRestartComplete(rv); |
| 600 net_log_.EndEventWithNetErrorCode( | 582 net_log_.EndEventWithNetErrorCode( |
| 601 NetLog::TYPE_HTTP_TRANSACTION_DRAIN_BODY_FOR_AUTH_RESTART, rv); | 583 NetLog::TYPE_HTTP_TRANSACTION_DRAIN_BODY_FOR_AUTH_RESTART, rv); |
| 602 break; | 584 break; |
| 603 default: | 585 default: |
| 604 NOTREACHED() << "bad state"; | 586 NOTREACHED() << "bad state"; |
| 605 rv = ERR_FAILED; | 587 rv = ERR_FAILED; |
| (...skipping 594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1200 // NOTE: if the SSLClientSocket class doesn't support TLS 1.1, | 1182 // NOTE: if the SSLClientSocket class doesn't support TLS 1.1, |
| 1201 // specifying TLS 1.1 in version_max will result in a TLS 1.0 | 1183 // specifying TLS 1.1 in version_max will result in a TLS 1.0 |
| 1202 // handshake, so falling back from TLS 1.1 to TLS 1.0 will simply | 1184 // handshake, so falling back from TLS 1.1 to TLS 1.0 will simply |
| 1203 // repeat the TLS 1.0 handshake. To avoid this problem, the default | 1185 // repeat the TLS 1.0 handshake. To avoid this problem, the default |
| 1204 // version_max should match the maximum protocol version supported | 1186 // version_max should match the maximum protocol version supported |
| 1205 // by the SSLClientSocket class. | 1187 // by the SSLClientSocket class. |
| 1206 uint16 version_before = server_ssl_config_.version_max; | 1188 uint16 version_before = server_ssl_config_.version_max; |
| 1207 server_ssl_config_.version_max--; | 1189 server_ssl_config_.version_max--; |
| 1208 net_log_.AddEvent( | 1190 net_log_.AddEvent( |
| 1209 NetLog::TYPE_SSL_VERSION_FALLBACK, | 1191 NetLog::TYPE_SSL_VERSION_FALLBACK, |
| 1210 make_scoped_refptr(new SSLVersionFallbackParams( | 1192 base::Bind(&NetLogSSLVersionFallbackCallback, |
| 1211 GetHostAndPort(request_->url), error, | 1193 &request_->url, error, version_before, |
| 1212 version_before, server_ssl_config_.version_max))); | 1194 server_ssl_config_.version_max)); |
| 1213 server_ssl_config_.version_fallback = true; | 1195 server_ssl_config_.version_fallback = true; |
| 1214 ResetConnectionAndRequestForResend(); | 1196 ResetConnectionAndRequestForResend(); |
| 1215 error = OK; | 1197 error = OK; |
| 1216 } | 1198 } |
| 1217 break; | 1199 break; |
| 1218 case ERR_SSL_DECOMPRESSION_FAILURE_ALERT: | 1200 case ERR_SSL_DECOMPRESSION_FAILURE_ALERT: |
| 1219 case ERR_SSL_BAD_RECORD_MAC_ALERT: | 1201 case ERR_SSL_BAD_RECORD_MAC_ALERT: |
| 1220 if (server_ssl_config_.version_max >= SSL_PROTOCOL_VERSION_TLS1 && | 1202 if (server_ssl_config_.version_max >= SSL_PROTOCOL_VERSION_TLS1 && |
| 1221 server_ssl_config_.version_min == SSL_PROTOCOL_VERSION_SSL3) { | 1203 server_ssl_config_.version_min == SSL_PROTOCOL_VERSION_SSL3) { |
| 1222 // This could be a server with buggy DEFLATE support. Turn off TLS, | 1204 // This could be a server with buggy DEFLATE support. Turn off TLS, |
| 1223 // DEFLATE support and retry. | 1205 // DEFLATE support and retry. |
| 1224 // TODO(wtc): turn off DEFLATE support only. Do not tie it to TLS. | 1206 // TODO(wtc): turn off DEFLATE support only. Do not tie it to TLS. |
| 1225 uint16 version_before = server_ssl_config_.version_max; | 1207 uint16 version_before = server_ssl_config_.version_max; |
| 1226 server_ssl_config_.version_max = SSL_PROTOCOL_VERSION_SSL3; | 1208 server_ssl_config_.version_max = SSL_PROTOCOL_VERSION_SSL3; |
| 1227 net_log_.AddEvent( | 1209 net_log_.AddEvent( |
| 1228 NetLog::TYPE_SSL_VERSION_FALLBACK, | 1210 NetLog::TYPE_SSL_VERSION_FALLBACK, |
| 1229 make_scoped_refptr(new SSLVersionFallbackParams( | 1211 base::Bind(&NetLogSSLVersionFallbackCallback, |
| 1230 GetHostAndPort(request_->url), error, | 1212 &request_->url, error, version_before, |
| 1231 version_before, server_ssl_config_.version_max))); | 1213 server_ssl_config_.version_max)); |
| 1232 server_ssl_config_.version_fallback = true; | 1214 server_ssl_config_.version_fallback = true; |
| 1233 ResetConnectionAndRequestForResend(); | 1215 ResetConnectionAndRequestForResend(); |
| 1234 error = OK; | 1216 error = OK; |
| 1235 } | 1217 } |
| 1236 break; | 1218 break; |
| 1237 } | 1219 } |
| 1238 return error; | 1220 return error; |
| 1239 } | 1221 } |
| 1240 | 1222 |
| 1241 // This method determines whether it is safe to resend the request after an | 1223 // This method determines whether it is safe to resend the request after an |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1261 case ERR_CONNECTION_ABORTED: | 1243 case ERR_CONNECTION_ABORTED: |
| 1262 // There can be a race between the socket pool checking checking whether a | 1244 // There can be a race between the socket pool checking checking whether a |
| 1263 // socket is still connected, receiving the FIN, and sending/reading data | 1245 // socket is still connected, receiving the FIN, and sending/reading data |
| 1264 // on a reused socket. If we receive the FIN between the connectedness | 1246 // on a reused socket. If we receive the FIN between the connectedness |
| 1265 // check and writing/reading from the socket, we may first learn the socket | 1247 // check and writing/reading from the socket, we may first learn the socket |
| 1266 // is disconnected when we get a ERR_SOCKET_NOT_CONNECTED. This will most | 1248 // is disconnected when we get a ERR_SOCKET_NOT_CONNECTED. This will most |
| 1267 // likely happen when trying to retrieve its IP address. | 1249 // likely happen when trying to retrieve its IP address. |
| 1268 // See http://crbug.com/105824 for more details. | 1250 // See http://crbug.com/105824 for more details. |
| 1269 case ERR_SOCKET_NOT_CONNECTED: | 1251 case ERR_SOCKET_NOT_CONNECTED: |
| 1270 if (ShouldResendRequest(error)) { | 1252 if (ShouldResendRequest(error)) { |
| 1271 net_log_.AddEvent( | 1253 net_log_.AddEventWithNetErrorCode( |
| 1272 NetLog::TYPE_HTTP_TRANSACTION_RESTART_AFTER_ERROR, | 1254 NetLog::TYPE_HTTP_TRANSACTION_RESTART_AFTER_ERROR, error); |
| 1273 make_scoped_refptr(new NetLogIntegerParameter("net_error", error))); | |
| 1274 ResetConnectionAndRequestForResend(); | 1255 ResetConnectionAndRequestForResend(); |
| 1275 error = OK; | 1256 error = OK; |
| 1276 } | 1257 } |
| 1277 break; | 1258 break; |
| 1278 case ERR_PIPELINE_EVICTION: | 1259 case ERR_PIPELINE_EVICTION: |
| 1279 if (!session_->force_http_pipelining()) { | 1260 if (!session_->force_http_pipelining()) { |
| 1280 net_log_.AddEvent( | 1261 net_log_.AddEventWithNetErrorCode( |
| 1281 NetLog::TYPE_HTTP_TRANSACTION_RESTART_AFTER_ERROR, | 1262 NetLog::TYPE_HTTP_TRANSACTION_RESTART_AFTER_ERROR, error); |
| 1282 make_scoped_refptr(new NetLogIntegerParameter("net_error", error))); | |
| 1283 ResetConnectionAndRequestForResend(); | 1263 ResetConnectionAndRequestForResend(); |
| 1284 error = OK; | 1264 error = OK; |
| 1285 } | 1265 } |
| 1286 break; | 1266 break; |
| 1287 case ERR_SPDY_PING_FAILED: | 1267 case ERR_SPDY_PING_FAILED: |
| 1288 case ERR_SPDY_SERVER_REFUSED_STREAM: | 1268 case ERR_SPDY_SERVER_REFUSED_STREAM: |
| 1289 net_log_.AddEvent( | 1269 net_log_.AddEventWithNetErrorCode( |
| 1290 NetLog::TYPE_HTTP_TRANSACTION_RESTART_AFTER_ERROR, | 1270 NetLog::TYPE_HTTP_TRANSACTION_RESTART_AFTER_ERROR, error); |
| 1291 make_scoped_refptr(new NetLogIntegerParameter("net_error", error))); | |
| 1292 ResetConnectionAndRequestForResend(); | 1271 ResetConnectionAndRequestForResend(); |
| 1293 error = OK; | 1272 error = OK; |
| 1294 break; | 1273 break; |
| 1295 } | 1274 } |
| 1296 return error; | 1275 return error; |
| 1297 } | 1276 } |
| 1298 | 1277 |
| 1299 void HttpNetworkTransaction::ResetStateForRestart() { | 1278 void HttpNetworkTransaction::ResetStateForRestart() { |
| 1300 ResetStateForAuthRestart(); | 1279 ResetStateForAuthRestart(); |
| 1301 stream_.reset(); | 1280 stream_.reset(); |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1430 description = base::StringPrintf("Unknown state 0x%08X (%u)", state, | 1409 description = base::StringPrintf("Unknown state 0x%08X (%u)", state, |
| 1431 state); | 1410 state); |
| 1432 break; | 1411 break; |
| 1433 } | 1412 } |
| 1434 return description; | 1413 return description; |
| 1435 } | 1414 } |
| 1436 | 1415 |
| 1437 #undef STATE_CASE | 1416 #undef STATE_CASE |
| 1438 | 1417 |
| 1439 } // namespace net | 1418 } // namespace net |
| OLD | NEW |