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/protocol_manager.h" | 5 #include "chrome/browser/safe_browsing/protocol_manager.h" |
6 | 6 |
7 #include "base/environment.h" | 7 #include "base/environment.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/memory/scoped_vector.h" | 9 #include "base/memory/scoped_vector.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 // If we are in GetHash backoff, we need to check if we're past the next | 176 // If we are in GetHash backoff, we need to check if we're past the next |
177 // allowed time. If we are, we can proceed with the request. If not, we are | 177 // allowed time. If we are, we can proceed with the request. If not, we are |
178 // required to return empty results (i.e. treat the page as safe). | 178 // required to return empty results (i.e. treat the page as safe). |
179 if (gethash_error_count_ && Time::Now() <= next_gethash_time_) { | 179 if (gethash_error_count_ && Time::Now() <= next_gethash_time_) { |
180 RecordGetHashResult(is_download, GET_HASH_BACKOFF_ERROR); | 180 RecordGetHashResult(is_download, GET_HASH_BACKOFF_ERROR); |
181 std::vector<SBFullHashResult> full_hashes; | 181 std::vector<SBFullHashResult> full_hashes; |
182 callback.Run(full_hashes, base::TimeDelta()); | 182 callback.Run(full_hashes, base::TimeDelta()); |
183 return; | 183 return; |
184 } | 184 } |
185 GURL gethash_url = GetHashUrl(); | 185 GURL gethash_url = GetHashUrl(); |
186 net::URLFetcher* fetcher = net::URLFetcher::Create( | 186 net::URLFetcher* fetcher = |
187 url_fetcher_id_++, gethash_url, net::URLFetcher::POST, this); | 187 net::URLFetcher::Create(url_fetcher_id_++, gethash_url, |
| 188 net::URLFetcher::POST, this).release(); |
188 hash_requests_[fetcher] = FullHashDetails(callback, is_download); | 189 hash_requests_[fetcher] = FullHashDetails(callback, is_download); |
189 | 190 |
190 const std::string get_hash = safe_browsing::FormatGetHash(prefixes); | 191 const std::string get_hash = safe_browsing::FormatGetHash(prefixes); |
191 | 192 |
192 fetcher->SetLoadFlags(net::LOAD_DISABLE_CACHE); | 193 fetcher->SetLoadFlags(net::LOAD_DISABLE_CACHE); |
193 fetcher->SetRequestContext(request_context_getter_.get()); | 194 fetcher->SetRequestContext(request_context_getter_.get()); |
194 fetcher->SetUploadData("text/plain", get_hash); | 195 fetcher->SetUploadData("text/plain", get_hash); |
195 fetcher->Start(); | 196 fetcher->Start(); |
196 } | 197 } |
197 | 198 |
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
550 DCHECK(CalledOnValidThread()); | 551 DCHECK(CalledOnValidThread()); |
551 DCHECK_EQ(request_type_, UPDATE_REQUEST); | 552 DCHECK_EQ(request_type_, UPDATE_REQUEST); |
552 DCHECK(backup_update_reason >= 0 && | 553 DCHECK(backup_update_reason >= 0 && |
553 backup_update_reason < BACKUP_UPDATE_REASON_MAX); | 554 backup_update_reason < BACKUP_UPDATE_REASON_MAX); |
554 if (backup_url_prefixes_[backup_update_reason].empty()) | 555 if (backup_url_prefixes_[backup_update_reason].empty()) |
555 return false; | 556 return false; |
556 request_type_ = BACKUP_UPDATE_REQUEST; | 557 request_type_ = BACKUP_UPDATE_REQUEST; |
557 backup_update_reason_ = backup_update_reason; | 558 backup_update_reason_ = backup_update_reason; |
558 | 559 |
559 GURL backup_update_url = BackupUpdateUrl(backup_update_reason); | 560 GURL backup_update_url = BackupUpdateUrl(backup_update_reason); |
560 request_.reset(net::URLFetcher::Create( | 561 request_ = net::URLFetcher::Create(url_fetcher_id_++, backup_update_url, |
561 url_fetcher_id_++, backup_update_url, net::URLFetcher::POST, this)); | 562 net::URLFetcher::POST, this); |
562 request_->SetLoadFlags(net::LOAD_DISABLE_CACHE); | 563 request_->SetLoadFlags(net::LOAD_DISABLE_CACHE); |
563 request_->SetRequestContext(request_context_getter_.get()); | 564 request_->SetRequestContext(request_context_getter_.get()); |
564 request_->SetUploadData("text/plain", update_list_data_); | 565 request_->SetUploadData("text/plain", update_list_data_); |
565 request_->Start(); | 566 request_->Start(); |
566 | 567 |
567 // Begin the update request timeout. | 568 // Begin the update request timeout. |
568 timeout_timer_.Start(FROM_HERE, TimeDelta::FromSeconds(kSbMaxUpdateWaitSec), | 569 timeout_timer_.Start(FROM_HERE, TimeDelta::FromSeconds(kSbMaxUpdateWaitSec), |
569 this, | 570 this, |
570 &SafeBrowsingProtocolManager::UpdateResponseTimeout); | 571 &SafeBrowsingProtocolManager::UpdateResponseTimeout); |
571 | 572 |
572 return true; | 573 return true; |
573 } | 574 } |
574 | 575 |
575 void SafeBrowsingProtocolManager::IssueChunkRequest() { | 576 void SafeBrowsingProtocolManager::IssueChunkRequest() { |
576 DCHECK(CalledOnValidThread()); | 577 DCHECK(CalledOnValidThread()); |
577 // We are only allowed to have one request outstanding at any time. Also, | 578 // We are only allowed to have one request outstanding at any time. Also, |
578 // don't get the next url until the previous one has been written to disk so | 579 // don't get the next url until the previous one has been written to disk so |
579 // that we don't use too much memory. | 580 // that we don't use too much memory. |
580 if (request_.get() || chunk_request_urls_.empty() || chunk_pending_to_write_) | 581 if (request_.get() || chunk_request_urls_.empty() || chunk_pending_to_write_) |
581 return; | 582 return; |
582 | 583 |
583 ChunkUrl next_chunk = chunk_request_urls_.front(); | 584 ChunkUrl next_chunk = chunk_request_urls_.front(); |
584 DCHECK(!next_chunk.url.empty()); | 585 DCHECK(!next_chunk.url.empty()); |
585 GURL chunk_url = NextChunkUrl(next_chunk.url); | 586 GURL chunk_url = NextChunkUrl(next_chunk.url); |
586 request_type_ = CHUNK_REQUEST; | 587 request_type_ = CHUNK_REQUEST; |
587 request_.reset(net::URLFetcher::Create( | 588 request_ = net::URLFetcher::Create(url_fetcher_id_++, chunk_url, |
588 url_fetcher_id_++, chunk_url, net::URLFetcher::GET, this)); | 589 net::URLFetcher::GET, this); |
589 request_->SetLoadFlags(net::LOAD_DISABLE_CACHE); | 590 request_->SetLoadFlags(net::LOAD_DISABLE_CACHE); |
590 request_->SetRequestContext(request_context_getter_.get()); | 591 request_->SetRequestContext(request_context_getter_.get()); |
591 chunk_request_start_ = base::Time::Now(); | 592 chunk_request_start_ = base::Time::Now(); |
592 request_->Start(); | 593 request_->Start(); |
593 } | 594 } |
594 | 595 |
595 void SafeBrowsingProtocolManager::OnGetChunksComplete( | 596 void SafeBrowsingProtocolManager::OnGetChunksComplete( |
596 const std::vector<SBListChunkRanges>& lists, bool database_error) { | 597 const std::vector<SBListChunkRanges>& lists, bool database_error) { |
597 DCHECK(CalledOnValidThread()); | 598 DCHECK(CalledOnValidThread()); |
598 DCHECK_EQ(request_type_, UPDATE_REQUEST); | 599 DCHECK_EQ(request_type_, UPDATE_REQUEST); |
(...skipping 29 matching lines...) Expand all Loading... |
628 update_list_data_.append(safe_browsing::FormatList( | 629 update_list_data_.append(safe_browsing::FormatList( |
629 SBListChunkRanges(safe_browsing_util::kMalwareList))); | 630 SBListChunkRanges(safe_browsing_util::kMalwareList))); |
630 } | 631 } |
631 | 632 |
632 // Large requests are (probably) a sign of database corruption. | 633 // Large requests are (probably) a sign of database corruption. |
633 // Record stats to inform decisions about whether to automate | 634 // Record stats to inform decisions about whether to automate |
634 // deletion of such databases. http://crbug.com/120219 | 635 // deletion of such databases. http://crbug.com/120219 |
635 UMA_HISTOGRAM_COUNTS("SB2.UpdateRequestSize", update_list_data_.size()); | 636 UMA_HISTOGRAM_COUNTS("SB2.UpdateRequestSize", update_list_data_.size()); |
636 | 637 |
637 GURL update_url = UpdateUrl(); | 638 GURL update_url = UpdateUrl(); |
638 request_.reset(net::URLFetcher::Create( | 639 request_ = net::URLFetcher::Create(url_fetcher_id_++, update_url, |
639 url_fetcher_id_++, update_url, net::URLFetcher::POST, this)); | 640 net::URLFetcher::POST, this); |
640 request_->SetLoadFlags(net::LOAD_DISABLE_CACHE); | 641 request_->SetLoadFlags(net::LOAD_DISABLE_CACHE); |
641 request_->SetRequestContext(request_context_getter_.get()); | 642 request_->SetRequestContext(request_context_getter_.get()); |
642 request_->SetUploadData("text/plain", update_list_data_); | 643 request_->SetUploadData("text/plain", update_list_data_); |
643 request_->Start(); | 644 request_->Start(); |
644 | 645 |
645 // Begin the update request timeout. | 646 // Begin the update request timeout. |
646 timeout_timer_.Start(FROM_HERE, TimeDelta::FromSeconds(kSbMaxUpdateWaitSec), | 647 timeout_timer_.Start(FROM_HERE, TimeDelta::FromSeconds(kSbMaxUpdateWaitSec), |
647 this, | 648 this, |
648 &SafeBrowsingProtocolManager::UpdateResponseTimeout); | 649 &SafeBrowsingProtocolManager::UpdateResponseTimeout); |
649 } | 650 } |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
770 FullHashCallback callback, bool is_download) | 771 FullHashCallback callback, bool is_download) |
771 : callback(callback), | 772 : callback(callback), |
772 is_download(is_download) { | 773 is_download(is_download) { |
773 } | 774 } |
774 | 775 |
775 SafeBrowsingProtocolManager::FullHashDetails::~FullHashDetails() { | 776 SafeBrowsingProtocolManager::FullHashDetails::~FullHashDetails() { |
776 } | 777 } |
777 | 778 |
778 SafeBrowsingProtocolManagerDelegate::~SafeBrowsingProtocolManagerDelegate() { | 779 SafeBrowsingProtocolManagerDelegate::~SafeBrowsingProtocolManagerDelegate() { |
779 } | 780 } |
OLD | NEW |