| Index: content/browser/download/download_request_core.cc
 | 
| diff --git a/content/browser/download/download_request_core.cc b/content/browser/download/download_request_core.cc
 | 
| index 7e8d102d55c6b7b99df107aa0e86eb7f542ffa76..9018d7d06c92b404d5349144df435a87083e31a7 100644
 | 
| --- a/content/browser/download/download_request_core.cc
 | 
| +++ b/content/browser/download/download_request_core.cc
 | 
| @@ -398,7 +398,13 @@ void DownloadRequestCore::OnResponseCompleted(
 | 
|              << " status.error() = " << status.error()
 | 
|              << " response_code = " << response_code;
 | 
|  
 | 
| -  DownloadInterruptReason reason = HandleRequestStatus(status);
 | 
| +  bool has_strong_validators = false;
 | 
| +  if (request()->response_headers()) {
 | 
| +    has_strong_validators =
 | 
| +        request()->response_headers()->HasStrongValidators();
 | 
| +  }
 | 
| +  DownloadInterruptReason reason = HandleRequestStatus(
 | 
| +      status, has_strong_validators);
 | 
|  
 | 
|    if (status.error() == net::ERR_ABORTED) {
 | 
|      // ERR_ABORTED == something outside of the network
 | 
| @@ -422,12 +428,9 @@ void DownloadRequestCore::OnResponseCompleted(
 | 
|    }
 | 
|  
 | 
|    std::string accept_ranges;
 | 
| -  bool has_strong_validators = false;
 | 
|    if (request()->response_headers()) {
 | 
|      request()->response_headers()->EnumerateHeader(nullptr, "Accept-Ranges",
 | 
|                                                     &accept_ranges);
 | 
| -    has_strong_validators =
 | 
| -        request()->response_headers()->HasStrongValidators();
 | 
|    }
 | 
|    RecordAcceptsRanges(accept_ranges, bytes_read_, has_strong_validators);
 | 
|    RecordNetworkBlockage(base::TimeTicks::Now() - download_start_time_,
 | 
| @@ -500,7 +503,7 @@ std::string DownloadRequestCore::DebugString() const {
 | 
|  
 | 
|  // static
 | 
|  DownloadInterruptReason DownloadRequestCore::HandleRequestStatus(
 | 
| -    const net::URLRequestStatus& status) {
 | 
| +    const net::URLRequestStatus& status, bool has_strong_validators) {
 | 
|    net::Error error_code = net::OK;
 | 
|    if (!status.is_success()) {
 | 
|      error_code = static_cast<net::Error>(status.error());  // Normal case.
 | 
| @@ -509,12 +512,23 @@ DownloadInterruptReason DownloadRequestCore::HandleRequestStatus(
 | 
|        error_code = net::ERR_FAILED;
 | 
|    }
 | 
|  
 | 
| -  // ERR_CONTENT_LENGTH_MISMATCH is allowed since a number of servers in the
 | 
| -  // wild close the connection too early by mistake. Other browsers - IE9,
 | 
| -  // Firefox 11.0, and Safari 5.1.4 - treat downloads as complete in both cases,
 | 
| -  // so we follow their lead.
 | 
| -  if (error_code == net::ERR_CONTENT_LENGTH_MISMATCH)
 | 
| +  // ERR_CONTENT_LENGTH_MISMATCH can be caused by 1 of the following reasons:
 | 
| +  // 1. Server or proxy closes the connection too early.
 | 
| +  // 2. The content-length header is wrong.
 | 
| +  // If the download has strong validators, we can interrupt the download
 | 
| +  // and let it resume automatically. Otherwise, resuming the download will
 | 
| +  // cause it to restart and the download may never complete if the error was
 | 
| +  // caused by reason 2. As a result, downloads without strong validators are
 | 
| +  // treated as completed here.
 | 
| +  // TODO(qinmin): check the metrics from downloads with strong validators,
 | 
| +  // and decide whether we should interrupt downloads without strong validators
 | 
| +  // rather than complete them.
 | 
| +  if (error_code == net::ERR_CONTENT_LENGTH_MISMATCH &&
 | 
| +      !has_strong_validators) {
 | 
|      error_code = net::OK;
 | 
| +    RecordDownloadCount(COMPLETED_WITH_CONTENT_LENGTH_MISMATCH_COUNT);
 | 
| +  }
 | 
| +
 | 
|    DownloadInterruptReason reason = ConvertNetErrorToInterruptReason(
 | 
|        error_code, DOWNLOAD_INTERRUPT_FROM_NETWORK);
 | 
|  
 | 
| 
 |