Index: net/url_request/url_request_http_job.cc |
diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc |
index d22cff78035be33dcce419f1e85aaa501b786744..1d0fbf5f3231f88183d9004d77b731e4627f192c 100644 |
--- a/net/url_request/url_request_http_job.cc |
+++ b/net/url_request/url_request_http_job.cc |
@@ -319,7 +319,28 @@ void URLRequestHttpJob::NotifyHeadersComplete() { |
URLRequestJob::NotifyHeadersComplete(); |
} |
-void URLRequestHttpJob::NotifyDone(const URLRequestStatus& status) { |
+void URLRequestHttpJob::NotifyDone(const URLRequestStatus& original_status) { |
+ URLRequestStatus status(original_status); |
+ // 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 (status.os_error() == 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. |
+ status.set_status(URLRequestStatus::SUCCESS); |
+ status.set_os_error(0); |
+ } |
+ } |
+ } |
+ |
RecordCompressionHistograms(); |
URLRequestJob::NotifyDone(status); |
} |