| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/build_time.h" | 10 #include "base/build_time.h" |
| (...skipping 747 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 758 void URLRequestHttpJob::OnHeadersReceivedCallback(int result) { | 758 void URLRequestHttpJob::OnHeadersReceivedCallback(int result) { |
| 759 request_->net_log().EndEvent( | 759 request_->net_log().EndEvent( |
| 760 NetLog::TYPE_URL_REQUEST_BLOCKED_ON_DELEGATE, NULL); | 760 NetLog::TYPE_URL_REQUEST_BLOCKED_ON_DELEGATE, NULL); |
| 761 awaiting_callback_ = false; | 761 awaiting_callback_ = false; |
| 762 SaveCookiesAndNotifyHeadersComplete(result); | 762 SaveCookiesAndNotifyHeadersComplete(result); |
| 763 } | 763 } |
| 764 | 764 |
| 765 void URLRequestHttpJob::OnReadCompleted(int result) { | 765 void URLRequestHttpJob::OnReadCompleted(int result) { |
| 766 read_in_progress_ = false; | 766 read_in_progress_ = false; |
| 767 | 767 |
| 768 if (ShouldFixMismatchedContentLength(result)) |
| 769 result = 0; |
| 770 |
| 768 if (result == 0) { | 771 if (result == 0) { |
| 769 NotifyDone(URLRequestStatus()); | 772 NotifyDone(URLRequestStatus()); |
| 770 } else if (result < 0) { | 773 } else if (result < 0) { |
| 771 NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, result)); | 774 NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, result)); |
| 772 } else { | 775 } else { |
| 773 // Clear the IO_PENDING status | 776 // Clear the IO_PENDING status |
| 774 SetStatus(URLRequestStatus()); | 777 SetStatus(URLRequestStatus()); |
| 775 } | 778 } |
| 776 | 779 |
| 777 NotifyReadComplete(result); | 780 NotifyReadComplete(result); |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1093 return; | 1096 return; |
| 1094 | 1097 |
| 1095 // The transaction started synchronously, but we need to notify the | 1098 // The transaction started synchronously, but we need to notify the |
| 1096 // URLRequest delegate via the message loop. | 1099 // URLRequest delegate via the message loop. |
| 1097 MessageLoop::current()->PostTask( | 1100 MessageLoop::current()->PostTask( |
| 1098 FROM_HERE, | 1101 FROM_HERE, |
| 1099 method_factory_.NewRunnableMethod( | 1102 method_factory_.NewRunnableMethod( |
| 1100 &URLRequestHttpJob::OnStartCompleted, rv)); | 1103 &URLRequestHttpJob::OnStartCompleted, rv)); |
| 1101 } | 1104 } |
| 1102 | 1105 |
| 1106 bool URLRequestHttpJob::ShouldFixMismatchedContentLength(int rv) const { |
| 1107 // Some servers send the body compressed, but specify the content length as |
| 1108 // the uncompressed size. Although this violates the HTTP spec we want to |
| 1109 // support it (as IE and FireFox do), but *only* for an exact match. |
| 1110 // See http://crbug.com/79694. |
| 1111 if (rv == net::ERR_CONNECTION_CLOSED) { |
| 1112 if (request_ && request_->response_headers()) { |
| 1113 int64 expected_length = request_->response_headers()->GetContentLength(); |
| 1114 VLOG(1) << __FUNCTION__ << "() " |
| 1115 << "\"" << request_->url().spec() << "\"" |
| 1116 << " content-length = " << expected_length |
| 1117 << " pre total = " << prefilter_bytes_read() |
| 1118 << " post total = " << postfilter_bytes_read(); |
| 1119 if (postfilter_bytes_read() == expected_length) { |
| 1120 // Clear the error. |
| 1121 return true; |
| 1122 } |
| 1123 } |
| 1124 } |
| 1125 return false; |
| 1126 } |
| 1127 |
| 1103 bool URLRequestHttpJob::ReadRawData(IOBuffer* buf, int buf_size, | 1128 bool URLRequestHttpJob::ReadRawData(IOBuffer* buf, int buf_size, |
| 1104 int* bytes_read) { | 1129 int* bytes_read) { |
| 1105 DCHECK_NE(buf_size, 0); | 1130 DCHECK_NE(buf_size, 0); |
| 1106 DCHECK(bytes_read); | 1131 DCHECK(bytes_read); |
| 1107 DCHECK(!read_in_progress_); | 1132 DCHECK(!read_in_progress_); |
| 1108 | 1133 |
| 1109 int rv = transaction_->Read(buf, buf_size, &read_callback_); | 1134 int rv = transaction_->Read(buf, buf_size, &read_callback_); |
| 1110 | 1135 |
| 1136 if (ShouldFixMismatchedContentLength(rv)) |
| 1137 rv = 0; |
| 1138 |
| 1111 if (rv >= 0) { | 1139 if (rv >= 0) { |
| 1112 *bytes_read = rv; | 1140 *bytes_read = rv; |
| 1113 if (!rv) | 1141 if (!rv) |
| 1114 DoneWithRequest(FINISHED); | 1142 DoneWithRequest(FINISHED); |
| 1115 return true; | 1143 return true; |
| 1116 } | 1144 } |
| 1117 | 1145 |
| 1118 if (rv == ERR_IO_PENDING) { | 1146 if (rv == ERR_IO_PENDING) { |
| 1119 read_in_progress_ = true; | 1147 read_in_progress_ = true; |
| 1120 SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0)); | 1148 SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0)); |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1412 return override_response_headers_.get() ? | 1440 return override_response_headers_.get() ? |
| 1413 override_response_headers_ : | 1441 override_response_headers_ : |
| 1414 transaction_->GetResponseInfo()->headers; | 1442 transaction_->GetResponseInfo()->headers; |
| 1415 } | 1443 } |
| 1416 | 1444 |
| 1417 void URLRequestHttpJob::NotifyURLRequestDestroyed() { | 1445 void URLRequestHttpJob::NotifyURLRequestDestroyed() { |
| 1418 awaiting_callback_ = false; | 1446 awaiting_callback_ = false; |
| 1419 } | 1447 } |
| 1420 | 1448 |
| 1421 } // namespace net | 1449 } // namespace net |
| OLD | NEW |