| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/safe_browsing/download_protection_service.h" | 5 #include "chrome/browser/safe_browsing/download_protection_service.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| (...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 } | 348 } |
| 349 | 349 |
| 350 // Start a timeout to cancel the request if it takes too long. | 350 // Start a timeout to cancel the request if it takes too long. |
| 351 // This should only be called after we have finished accessing the file. | 351 // This should only be called after we have finished accessing the file. |
| 352 void StartTimeout() { | 352 void StartTimeout() { |
| 353 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 353 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 354 if (!service_) { | 354 if (!service_) { |
| 355 // Request has already been cancelled. | 355 // Request has already been cancelled. |
| 356 return; | 356 return; |
| 357 } | 357 } |
| 358 timeout_start_time_ = base::TimeTicks::Now(); |
| 358 BrowserThread::PostDelayedTask( | 359 BrowserThread::PostDelayedTask( |
| 359 BrowserThread::UI, | 360 BrowserThread::UI, |
| 360 FROM_HERE, | 361 FROM_HERE, |
| 361 base::Bind(&CheckClientDownloadRequest::Cancel, | 362 base::Bind(&CheckClientDownloadRequest::Cancel, |
| 362 weakptr_factory_.GetWeakPtr()), | 363 weakptr_factory_.GetWeakPtr()), |
| 363 base::TimeDelta::FromMilliseconds( | 364 base::TimeDelta::FromMilliseconds( |
| 364 service_->download_request_timeout_ms())); | 365 service_->download_request_timeout_ms())); |
| 365 } | 366 } |
| 366 | 367 |
| 367 // Canceling a request will cause us to always report the result as SAFE | 368 // Canceling a request will cause us to always report the result as SAFE |
| (...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 726 << item_->GetUrlChain().back(); | 727 << item_->GetUrlChain().back(); |
| 727 fetcher_.reset(net::URLFetcher::Create(0 /* ID used for testing */, | 728 fetcher_.reset(net::URLFetcher::Create(0 /* ID used for testing */, |
| 728 GetDownloadRequestUrl(), | 729 GetDownloadRequestUrl(), |
| 729 net::URLFetcher::POST, | 730 net::URLFetcher::POST, |
| 730 this)); | 731 this)); |
| 731 fetcher_->SetLoadFlags(net::LOAD_DISABLE_CACHE); | 732 fetcher_->SetLoadFlags(net::LOAD_DISABLE_CACHE); |
| 732 fetcher_->SetAutomaticallyRetryOn5xx(false); // Don't retry on error. | 733 fetcher_->SetAutomaticallyRetryOn5xx(false); // Don't retry on error. |
| 733 fetcher_->SetRequestContext(service_->request_context_getter_.get()); | 734 fetcher_->SetRequestContext(service_->request_context_getter_.get()); |
| 734 fetcher_->SetUploadData("application/octet-stream", | 735 fetcher_->SetUploadData("application/octet-stream", |
| 735 client_download_request_data_); | 736 client_download_request_data_); |
| 737 request_start_time_ = base::TimeTicks::Now(); |
| 736 UMA_HISTOGRAM_COUNTS("SBClientDownload.DownloadRequestPayloadSize", | 738 UMA_HISTOGRAM_COUNTS("SBClientDownload.DownloadRequestPayloadSize", |
| 737 client_download_request_data_.size()); | 739 client_download_request_data_.size()); |
| 738 fetcher_->Start(); | 740 fetcher_->Start(); |
| 739 } | 741 } |
| 740 | 742 |
| 741 void PostFinishTask(DownloadCheckResult result, | 743 void PostFinishTask(DownloadCheckResult result, |
| 742 DownloadCheckResultReason reason) { | 744 DownloadCheckResultReason reason) { |
| 743 BrowserThread::PostTask( | 745 BrowserThread::PostTask( |
| 744 BrowserThread::UI, | 746 BrowserThread::UI, |
| 745 FROM_HERE, | 747 FROM_HERE, |
| 746 base::Bind(&CheckClientDownloadRequest::FinishRequest, this, result, | 748 base::Bind(&CheckClientDownloadRequest::FinishRequest, this, result, |
| 747 reason)); | 749 reason)); |
| 748 } | 750 } |
| 749 | 751 |
| 750 void FinishRequest(DownloadCheckResult result, | 752 void FinishRequest(DownloadCheckResult result, |
| 751 DownloadCheckResultReason reason) { | 753 DownloadCheckResultReason reason) { |
| 752 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 754 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 753 if (finished_) { | 755 if (finished_) { |
| 754 return; | 756 return; |
| 755 } | 757 } |
| 756 finished_ = true; | 758 finished_ = true; |
| 757 // Ensure the timeout task is cancelled while we still have a non-zero | 759 // Ensure the timeout task is cancelled while we still have a non-zero |
| 758 // refcount. (crbug.com/240449) | 760 // refcount. (crbug.com/240449) |
| 759 weakptr_factory_.InvalidateWeakPtrs(); | 761 weakptr_factory_.InvalidateWeakPtrs(); |
| 762 if (!timeout_start_time_.is_null()) { |
| 763 UMA_HISTOGRAM_TIMES("SBClientDownload.DownloadRequestTimeoutDuration", |
| 764 base::TimeTicks::Now() - timeout_start_time_); |
| 765 } |
| 766 if (!request_start_time_.is_null()) { |
| 767 UMA_HISTOGRAM_TIMES("SBClientDownload.DownloadRequestNetworkDuration", |
| 768 base::TimeTicks::Now() - request_start_time_); |
| 769 } |
| 760 if (service_) { | 770 if (service_) { |
| 761 VLOG(2) << "SafeBrowsing download verdict for: " | 771 VLOG(2) << "SafeBrowsing download verdict for: " |
| 762 << item_->DebugString(true) << " verdict:" << reason; | 772 << item_->DebugString(true) << " verdict:" << reason; |
| 763 UMA_HISTOGRAM_ENUMERATION("SBClientDownload.CheckDownloadStats", | 773 UMA_HISTOGRAM_ENUMERATION("SBClientDownload.CheckDownloadStats", |
| 764 reason, | 774 reason, |
| 765 REASON_MAX); | 775 REASON_MAX); |
| 766 callback_.Run(result); | 776 callback_.Run(result); |
| 767 item_->RemoveObserver(this); | 777 item_->RemoveObserver(this); |
| 768 item_ = NULL; | 778 item_ = NULL; |
| 769 DownloadProtectionService* service = service_; | 779 DownloadProtectionService* service = service_; |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 840 const bool pingback_enabled_; | 850 const bool pingback_enabled_; |
| 841 scoped_ptr<net::URLFetcher> fetcher_; | 851 scoped_ptr<net::URLFetcher> fetcher_; |
| 842 scoped_refptr<SandboxedZipAnalyzer> analyzer_; | 852 scoped_refptr<SandboxedZipAnalyzer> analyzer_; |
| 843 base::TimeTicks zip_analysis_start_time_; | 853 base::TimeTicks zip_analysis_start_time_; |
| 844 bool finished_; | 854 bool finished_; |
| 845 ClientDownloadRequest::DownloadType type_; | 855 ClientDownloadRequest::DownloadType type_; |
| 846 std::string client_download_request_data_; | 856 std::string client_download_request_data_; |
| 847 CancelableRequestConsumer request_consumer_; // For HistoryService lookup. | 857 CancelableRequestConsumer request_consumer_; // For HistoryService lookup. |
| 848 base::WeakPtrFactory<CheckClientDownloadRequest> weakptr_factory_; | 858 base::WeakPtrFactory<CheckClientDownloadRequest> weakptr_factory_; |
| 849 base::TimeTicks start_time_; // Used for stats. | 859 base::TimeTicks start_time_; // Used for stats. |
| 860 base::TimeTicks timeout_start_time_; |
| 861 base::TimeTicks request_start_time_; |
| 850 | 862 |
| 851 DISALLOW_COPY_AND_ASSIGN(CheckClientDownloadRequest); | 863 DISALLOW_COPY_AND_ASSIGN(CheckClientDownloadRequest); |
| 852 }; | 864 }; |
| 853 | 865 |
| 854 DownloadProtectionService::DownloadProtectionService( | 866 DownloadProtectionService::DownloadProtectionService( |
| 855 SafeBrowsingService* sb_service, | 867 SafeBrowsingService* sb_service, |
| 856 net::URLRequestContextGetter* request_context_getter) | 868 net::URLRequestContextGetter* request_context_getter) |
| 857 : request_context_getter_(request_context_getter), | 869 : request_context_getter_(request_context_getter), |
| 858 enabled_(false), | 870 enabled_(false), |
| 859 binary_feature_extractor_(new BinaryFeatureExtractor()), | 871 binary_feature_extractor_(new BinaryFeatureExtractor()), |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1040 GURL DownloadProtectionService::GetDownloadRequestUrl() { | 1052 GURL DownloadProtectionService::GetDownloadRequestUrl() { |
| 1041 GURL url(kDownloadRequestUrl); | 1053 GURL url(kDownloadRequestUrl); |
| 1042 std::string api_key = google_apis::GetAPIKey(); | 1054 std::string api_key = google_apis::GetAPIKey(); |
| 1043 if (!api_key.empty()) | 1055 if (!api_key.empty()) |
| 1044 url = url.Resolve("?key=" + net::EscapeQueryParamValue(api_key, true)); | 1056 url = url.Resolve("?key=" + net::EscapeQueryParamValue(api_key, true)); |
| 1045 | 1057 |
| 1046 return url; | 1058 return url; |
| 1047 } | 1059 } |
| 1048 | 1060 |
| 1049 } // namespace safe_browsing | 1061 } // namespace safe_browsing |
| OLD | NEW |