Chromium Code Reviews| Index: chrome/browser/safe_browsing/download_protection_service.cc |
| diff --git a/chrome/browser/safe_browsing/download_protection_service.cc b/chrome/browser/safe_browsing/download_protection_service.cc |
| index 71fa9c3e71d3638eec0041145ec6af4bdc6f01f0..e446b9071165ffe8a0f4a8771ad436738b8990e9 100644 |
| --- a/chrome/browser/safe_browsing/download_protection_service.cc |
| +++ b/chrome/browser/safe_browsing/download_protection_service.cc |
| @@ -27,6 +27,10 @@ |
| using content::BrowserThread; |
| +namespace { |
| +static const int64 kDownloadRequestTimeoutMs = 3000; |
| +} // namespace |
| + |
| namespace safe_browsing { |
| const char DownloadProtectionService::kDownloadRequestUrl[] = |
| @@ -144,7 +148,7 @@ DownloadProtectionService::DownloadInfo::FromDownloadItem( |
| download_info.target_file = item.GetTargetFilePath(); |
| download_info.download_url_chain = item.url_chain(); |
| download_info.referrer_url = item.referrer_url(); |
| - // TODO(bryner): Fill in the hash (we shouldn't compute it again) |
| + download_info.sha256_hash = item.hash(); |
| download_info.total_bytes = item.total_bytes(); |
| // TODO(bryner): Populate user_initiated |
| return download_info; |
| @@ -332,7 +336,8 @@ class DownloadProtectionService::CheckClientDownloadRequest |
| service_(service), |
| signature_util_(signature_util), |
| sb_service_(sb_service), |
| - pingback_enabled_(service_->enabled()) { |
| + pingback_enabled_(service_->enabled()), |
| + finished_(false) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| } |
| @@ -366,6 +371,13 @@ class DownloadProtectionService::CheckClientDownloadRequest |
| return; |
| } |
| + // If the request takes too long we cancel it. |
| + BrowserThread::PostDelayedTask( |
| + BrowserThread::UI, |
| + FROM_HERE, |
| + base::Bind(&CheckClientDownloadRequest::Cancel, this), |
| + service_->download_request_timeout_ms()); |
| + |
| // Compute features from the file contents. Note that we record histograms |
| // based on the result, so this runs regardless of whether the pingbacks |
| // are enabled. Since we do blocking I/O, this happens on the file thread. |
| @@ -552,6 +564,7 @@ class DownloadProtectionService::CheckClientDownloadRequest |
| content::URLFetcher::POST, |
| this)); |
| fetcher_->SetLoadFlags(net::LOAD_DISABLE_CACHE); |
| + fetcher_->SetAutomaticallyRetryOn5xx(false); // Don't retry on error. |
| fetcher_->SetRequestContext(service_->request_context_getter_.get()); |
| fetcher_->SetUploadData("application/octet-stream", request_data); |
| fetcher_->Start(); |
| @@ -566,6 +579,10 @@ class DownloadProtectionService::CheckClientDownloadRequest |
| void FinishRequest(DownloadCheckResult result) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + if (finished_) { |
| + return; |
|
Brian Ryner
2011/11/17 02:07:03
I don't think this will remove the request from do
|
| + } |
| + finished_ = true; |
| if (service_) { |
| callback_.Run(result); |
| service_->RequestFinished(this); |
| @@ -589,6 +606,7 @@ class DownloadProtectionService::CheckClientDownloadRequest |
| scoped_refptr<SafeBrowsingService> sb_service_; |
| const bool pingback_enabled_; |
| scoped_ptr<content::URLFetcher> fetcher_; |
| + bool finished_; |
| DISALLOW_COPY_AND_ASSIGN(CheckClientDownloadRequest); |
| }; |
| @@ -599,7 +617,8 @@ DownloadProtectionService::DownloadProtectionService( |
| : sb_service_(sb_service), |
| request_context_getter_(request_context_getter), |
| enabled_(false), |
| - signature_util_(new SignatureUtil()) {} |
| + signature_util_(new SignatureUtil()), |
| + download_request_timeout_ms_(kDownloadRequestTimeoutMs) {} |
| DownloadProtectionService::~DownloadProtectionService() { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |