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/url_request/url_request_http_job.h" | 5 #include "net/url_request/url_request_http_job.h" |
6 | 6 |
7 #include "base/base_switches.h" | 7 #include "base/base_switches.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 736 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
747 | 747 |
748 // Check that there are no callbacks to already canceled requests. | 748 // Check that there are no callbacks to already canceled requests. |
749 DCHECK_NE(URLRequestStatus::CANCELED, GetStatus().status()); | 749 DCHECK_NE(URLRequestStatus::CANCELED, GetStatus().status()); |
750 | 750 |
751 SaveCookiesAndNotifyHeadersComplete(result); | 751 SaveCookiesAndNotifyHeadersComplete(result); |
752 } | 752 } |
753 | 753 |
754 void URLRequestHttpJob::OnReadCompleted(int result) { | 754 void URLRequestHttpJob::OnReadCompleted(int result) { |
755 read_in_progress_ = false; | 755 read_in_progress_ = false; |
756 | 756 |
757 if (ShouldFixMismatchedContentLength(result)) | |
758 result = 0; | |
759 | |
760 if (result == 0) { | 757 if (result == 0) { |
761 NotifyDone(URLRequestStatus()); | 758 NotifyDone(URLRequestStatus()); |
762 } else if (result < 0) { | 759 } else if (result < 0) { |
763 NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, result)); | 760 NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, result)); |
764 } else { | 761 } else { |
765 // Clear the IO_PENDING status | 762 // Clear the IO_PENDING status |
766 SetStatus(URLRequestStatus()); | 763 SetStatus(URLRequestStatus()); |
767 } | 764 } |
768 | 765 |
769 NotifyReadComplete(result); | 766 NotifyReadComplete(result); |
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1086 return; | 1083 return; |
1087 | 1084 |
1088 // The transaction started synchronously, but we need to notify the | 1085 // The transaction started synchronously, but we need to notify the |
1089 // URLRequest delegate via the message loop. | 1086 // URLRequest delegate via the message loop. |
1090 MessageLoop::current()->PostTask( | 1087 MessageLoop::current()->PostTask( |
1091 FROM_HERE, | 1088 FROM_HERE, |
1092 base::Bind(&URLRequestHttpJob::OnStartCompleted, | 1089 base::Bind(&URLRequestHttpJob::OnStartCompleted, |
1093 weak_factory_.GetWeakPtr(), rv)); | 1090 weak_factory_.GetWeakPtr(), rv)); |
1094 } | 1091 } |
1095 | 1092 |
1096 bool URLRequestHttpJob::ShouldFixMismatchedContentLength(int rv) const { | |
1097 // Some servers send the body compressed, but specify the content length as | |
1098 // the uncompressed size. Although this violates the HTTP spec we want to | |
1099 // support it (as IE and FireFox do), but *only* for an exact match. | |
1100 // See http://crbug.com/79694. | |
1101 if (rv == net::ERR_CONNECTION_CLOSED) { | |
1102 if (request_ && request_->response_headers()) { | |
1103 int64 expected_length = request_->response_headers()->GetContentLength(); | |
1104 VLOG(1) << __FUNCTION__ << "() " | |
1105 << "\"" << request_->url().spec() << "\"" | |
1106 << " content-length = " << expected_length | |
1107 << " pre total = " << prefilter_bytes_read() | |
1108 << " post total = " << postfilter_bytes_read(); | |
1109 if (postfilter_bytes_read() == expected_length) { | |
1110 // Clear the error. | |
1111 return true; | |
1112 } | |
1113 } | |
1114 } | |
1115 return false; | |
1116 } | |
1117 | |
1118 bool URLRequestHttpJob::ReadRawData(IOBuffer* buf, int buf_size, | 1093 bool URLRequestHttpJob::ReadRawData(IOBuffer* buf, int buf_size, |
1119 int* bytes_read) { | 1094 int* bytes_read) { |
1120 DCHECK_NE(buf_size, 0); | 1095 DCHECK_NE(buf_size, 0); |
1121 DCHECK(bytes_read); | 1096 DCHECK(bytes_read); |
1122 DCHECK(!read_in_progress_); | 1097 DCHECK(!read_in_progress_); |
1123 | 1098 |
1124 int rv = transaction_->Read( | 1099 int rv = transaction_->Read( |
1125 buf, buf_size, | 1100 buf, buf_size, |
1126 base::Bind(&URLRequestHttpJob::OnReadCompleted, base::Unretained(this))); | 1101 base::Bind(&URLRequestHttpJob::OnReadCompleted, base::Unretained(this))); |
1127 | 1102 |
1128 if (ShouldFixMismatchedContentLength(rv)) | |
1129 rv = 0; | |
1130 | |
1131 if (rv >= 0) { | 1103 if (rv >= 0) { |
1132 *bytes_read = rv; | 1104 *bytes_read = rv; |
1133 if (!rv) | 1105 if (!rv) |
1134 DoneWithRequest(FINISHED); | 1106 DoneWithRequest(FINISHED); |
1135 return true; | 1107 return true; |
1136 } | 1108 } |
1137 | 1109 |
1138 if (rv == ERR_IO_PENDING) { | 1110 if (rv == ERR_IO_PENDING) { |
1139 read_in_progress_ = true; | 1111 read_in_progress_ = true; |
1140 SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0)); | 1112 SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0)); |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1415 return override_response_headers_.get() ? | 1387 return override_response_headers_.get() ? |
1416 override_response_headers_ : | 1388 override_response_headers_ : |
1417 transaction_->GetResponseInfo()->headers; | 1389 transaction_->GetResponseInfo()->headers; |
1418 } | 1390 } |
1419 | 1391 |
1420 void URLRequestHttpJob::NotifyURLRequestDestroyed() { | 1392 void URLRequestHttpJob::NotifyURLRequestDestroyed() { |
1421 awaiting_callback_ = false; | 1393 awaiting_callback_ = false; |
1422 } | 1394 } |
1423 | 1395 |
1424 } // namespace net | 1396 } // namespace net |
OLD | NEW |