Index: net/url_request/url_request_http_job.cc |
=================================================================== |
--- net/url_request/url_request_http_job.cc (revision 113482) |
+++ net/url_request/url_request_http_job.cc (working copy) |
@@ -765,6 +765,9 @@ |
void URLRequestHttpJob::OnReadCompleted(int result) { |
read_in_progress_ = false; |
+ if (ShouldFixMismatchedContentLength(result)) |
+ result = 0; |
+ |
if (result == 0) { |
NotifyDone(URLRequestStatus()); |
} else if (result < 0) { |
@@ -1100,6 +1103,28 @@ |
&URLRequestHttpJob::OnStartCompleted, rv)); |
} |
+bool URLRequestHttpJob::ShouldFixMismatchedContentLength(int rv) const { |
+ // Some servers send the body compressed, but specify the content length as |
+ // the uncompressed size. Although this violates the HTTP spec we want to |
+ // support it (as IE and FireFox do), but *only* for an exact match. |
+ // See http://crbug.com/79694. |
+ if (rv == net::ERR_CONNECTION_CLOSED) { |
+ if (request_ && request_->response_headers()) { |
+ int64 expected_length = request_->response_headers()->GetContentLength(); |
+ VLOG(1) << __FUNCTION__ << "() " |
+ << "\"" << request_->url().spec() << "\"" |
+ << " content-length = " << expected_length |
+ << " pre total = " << prefilter_bytes_read() |
+ << " post total = " << postfilter_bytes_read(); |
+ if (postfilter_bytes_read() == expected_length) { |
+ // Clear the error. |
+ return true; |
+ } |
+ } |
+ } |
+ return false; |
+} |
+ |
bool URLRequestHttpJob::ReadRawData(IOBuffer* buf, int buf_size, |
int* bytes_read) { |
DCHECK_NE(buf_size, 0); |
@@ -1108,6 +1133,9 @@ |
int rv = transaction_->Read(buf, buf_size, &read_callback_); |
+ if (ShouldFixMismatchedContentLength(rv)) |
+ rv = 0; |
+ |
if (rv >= 0) { |
*bytes_read = rv; |
if (!rv) |