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)); |