| 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 // Implementation of the MalwareDetails class. | 5 // Implementation of the MalwareDetails class. |
| 6 | 6 |
| 7 #include "chrome/browser/safe_browsing/malware_details.h" | 7 #include "chrome/browser/safe_browsing/malware_details.h" |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 has_started_ = true; | 49 has_started_ = true; |
| 50 | 50 |
| 51 // Post a task in the message loop, so the callers don't need to | 51 // Post a task in the message loop, so the callers don't need to |
| 52 // check if we call their callback immediately. | 52 // check if we call their callback immediately. |
| 53 BrowserThread::PostTask( | 53 BrowserThread::PostTask( |
| 54 BrowserThread::IO, FROM_HERE, | 54 BrowserThread::IO, FROM_HERE, |
| 55 base::Bind(&MalwareDetailsCacheCollector::OpenEntry, this)); | 55 base::Bind(&MalwareDetailsCacheCollector::OpenEntry, this)); |
| 56 } | 56 } |
| 57 | 57 |
| 58 bool MalwareDetailsCacheCollector::HasStarted() { | 58 bool MalwareDetailsCacheCollector::HasStarted() { |
| 59 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 59 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 60 return has_started_; | 60 return has_started_; |
| 61 } | 61 } |
| 62 | 62 |
| 63 MalwareDetailsCacheCollector::~MalwareDetailsCacheCollector() {} | 63 MalwareDetailsCacheCollector::~MalwareDetailsCacheCollector() {} |
| 64 | 64 |
| 65 // Fetch a URL and advance to the next one when done. | 65 // Fetch a URL and advance to the next one when done. |
| 66 void MalwareDetailsCacheCollector::OpenEntry() { | 66 void MalwareDetailsCacheCollector::OpenEntry() { |
| 67 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 67 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 68 DVLOG(1) << "OpenEntry"; | 68 DVLOG(1) << "OpenEntry"; |
| 69 | 69 |
| 70 if (resources_it_ == resources_->end()) { | 70 if (resources_it_ == resources_->end()) { |
| 71 AllDone(true); | 71 AllDone(true); |
| 72 return; | 72 return; |
| 73 } | 73 } |
| 74 | 74 |
| 75 if (!request_context_getter_.get()) { | 75 if (!request_context_getter_.get()) { |
| 76 DVLOG(1) << "Missing request context getter"; | 76 DVLOG(1) << "Missing request context getter"; |
| 77 AllDone(false); | 77 AllDone(false); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 93 safe_browsing::ResourceMap::iterator it = resources_->find(url.spec()); | 93 safe_browsing::ResourceMap::iterator it = resources_->find(url.spec()); |
| 94 if (it != resources_->end()) { | 94 if (it != resources_->end()) { |
| 95 return it->second.get(); | 95 return it->second.get(); |
| 96 } | 96 } |
| 97 return NULL; | 97 return NULL; |
| 98 } | 98 } |
| 99 | 99 |
| 100 void MalwareDetailsCacheCollector::OnURLFetchComplete( | 100 void MalwareDetailsCacheCollector::OnURLFetchComplete( |
| 101 const net::URLFetcher* source) { | 101 const net::URLFetcher* source) { |
| 102 DVLOG(1) << "OnUrlFetchComplete"; | 102 DVLOG(1) << "OnUrlFetchComplete"; |
| 103 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 103 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 104 DCHECK(current_fetch_.get()); | 104 DCHECK(current_fetch_.get()); |
| 105 if (source->GetStatus().status() != net::URLRequestStatus::SUCCESS && | 105 if (source->GetStatus().status() != net::URLRequestStatus::SUCCESS && |
| 106 source->GetStatus().error() == net::ERR_CACHE_MISS) { | 106 source->GetStatus().error() == net::ERR_CACHE_MISS) { |
| 107 // Cache miss, skip this resource. | 107 // Cache miss, skip this resource. |
| 108 DVLOG(1) << "Cache miss for url: " << source->GetURL(); | 108 DVLOG(1) << "Cache miss for url: " << source->GetURL(); |
| 109 AdvanceEntry(); | 109 AdvanceEntry(); |
| 110 return; | 110 return; |
| 111 } | 111 } |
| 112 | 112 |
| 113 if (source->GetStatus().status() != net::URLRequestStatus::SUCCESS) { | 113 if (source->GetStatus().status() != net::URLRequestStatus::SUCCESS) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 132 std::string data; | 132 std::string data; |
| 133 source->GetResponseAsString(&data); | 133 source->GetResponseAsString(&data); |
| 134 ReadData(resource, data); | 134 ReadData(resource, data); |
| 135 AdvanceEntry(); | 135 AdvanceEntry(); |
| 136 } | 136 } |
| 137 | 137 |
| 138 void MalwareDetailsCacheCollector::ReadResponse( | 138 void MalwareDetailsCacheCollector::ReadResponse( |
| 139 ClientMalwareReportRequest::Resource* pb_resource, | 139 ClientMalwareReportRequest::Resource* pb_resource, |
| 140 const net::URLFetcher* source) { | 140 const net::URLFetcher* source) { |
| 141 DVLOG(1) << "ReadResponse"; | 141 DVLOG(1) << "ReadResponse"; |
| 142 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 142 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 143 net::HttpResponseHeaders* headers = source->GetResponseHeaders(); | 143 net::HttpResponseHeaders* headers = source->GetResponseHeaders(); |
| 144 if (!headers) { | 144 if (!headers) { |
| 145 DVLOG(1) << "Missing response headers."; | 145 DVLOG(1) << "Missing response headers."; |
| 146 return; | 146 return; |
| 147 } | 147 } |
| 148 | 148 |
| 149 ClientMalwareReportRequest::HTTPResponse* pb_response = | 149 ClientMalwareReportRequest::HTTPResponse* pb_response = |
| 150 pb_resource->mutable_response(); | 150 pb_resource->mutable_response(); |
| 151 pb_response->mutable_firstline()->set_code(headers->response_code()); | 151 pb_response->mutable_firstline()->set_code(headers->response_code()); |
| 152 void* iter = NULL; | 152 void* iter = NULL; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 165 | 165 |
| 166 if (!source->WasFetchedViaProxy()) { | 166 if (!source->WasFetchedViaProxy()) { |
| 167 pb_response->set_remote_ip(source->GetSocketAddress().ToString()); | 167 pb_response->set_remote_ip(source->GetSocketAddress().ToString()); |
| 168 } | 168 } |
| 169 } | 169 } |
| 170 | 170 |
| 171 void MalwareDetailsCacheCollector::ReadData( | 171 void MalwareDetailsCacheCollector::ReadData( |
| 172 ClientMalwareReportRequest::Resource* pb_resource, | 172 ClientMalwareReportRequest::Resource* pb_resource, |
| 173 const std::string& data) { | 173 const std::string& data) { |
| 174 DVLOG(1) << "ReadData"; | 174 DVLOG(1) << "ReadData"; |
| 175 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 175 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 176 ClientMalwareReportRequest::HTTPResponse* pb_response = | 176 ClientMalwareReportRequest::HTTPResponse* pb_response = |
| 177 pb_resource->mutable_response(); | 177 pb_resource->mutable_response(); |
| 178 if (data.size() <= kMaxBodySizeBytes) { // Only send small bodies for now. | 178 if (data.size() <= kMaxBodySizeBytes) { // Only send small bodies for now. |
| 179 pb_response->set_body(data); | 179 pb_response->set_body(data); |
| 180 } | 180 } |
| 181 pb_response->set_bodylength(data.size()); | 181 pb_response->set_bodylength(data.size()); |
| 182 pb_response->set_bodydigest(base::MD5String(data)); | 182 pb_response->set_bodydigest(base::MD5String(data)); |
| 183 } | 183 } |
| 184 | 184 |
| 185 void MalwareDetailsCacheCollector::AdvanceEntry() { | 185 void MalwareDetailsCacheCollector::AdvanceEntry() { |
| 186 DVLOG(1) << "AdvanceEntry"; | 186 DVLOG(1) << "AdvanceEntry"; |
| 187 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 187 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 188 // Advance to the next resource. | 188 // Advance to the next resource. |
| 189 ++resources_it_; | 189 ++resources_it_; |
| 190 current_fetch_.reset(NULL); | 190 current_fetch_.reset(NULL); |
| 191 | 191 |
| 192 // Create a task so we don't take over the IO thread for too long. | 192 // Create a task so we don't take over the IO thread for too long. |
| 193 BrowserThread::PostTask( | 193 BrowserThread::PostTask( |
| 194 BrowserThread::IO, FROM_HERE, | 194 BrowserThread::IO, FROM_HERE, |
| 195 base::Bind(&MalwareDetailsCacheCollector::OpenEntry, this)); | 195 base::Bind(&MalwareDetailsCacheCollector::OpenEntry, this)); |
| 196 } | 196 } |
| 197 | 197 |
| 198 void MalwareDetailsCacheCollector::AllDone(bool success) { | 198 void MalwareDetailsCacheCollector::AllDone(bool success) { |
| 199 DVLOG(1) << "AllDone"; | 199 DVLOG(1) << "AllDone"; |
| 200 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 200 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 201 *result_ = success; | 201 *result_ = success; |
| 202 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, callback_); | 202 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, callback_); |
| 203 callback_.Reset(); | 203 callback_.Reset(); |
| 204 } | 204 } |
| OLD | NEW |