| Index: net/url_request/url_request_http_job.cc
|
| ===================================================================
|
| --- net/url_request/url_request_http_job.cc (revision 113513)
|
| +++ 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)
|
|
|