Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "components/safe_browsing_db/v4_update_protocol_manager.h" | 5 #include "components/safe_browsing_db/v4_update_protocol_manager.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/base64url.h" | 9 #include "base/base64url.h" |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 63 } // namespace | 63 } // namespace |
| 64 | 64 |
| 65 namespace safe_browsing { | 65 namespace safe_browsing { |
| 66 | 66 |
| 67 // Minimum time, in seconds, from start up before we must issue an update query. | 67 // Minimum time, in seconds, from start up before we must issue an update query. |
| 68 static const int kV4TimerStartIntervalSecMin = 60; | 68 static const int kV4TimerStartIntervalSecMin = 60; |
| 69 | 69 |
| 70 // Maximum time, in seconds, from start up before we must issue an update query. | 70 // Maximum time, in seconds, from start up before we must issue an update query. |
| 71 static const int kV4TimerStartIntervalSecMax = 300; | 71 static const int kV4TimerStartIntervalSecMax = 300; |
| 72 | 72 |
| 73 // Maximum time, in seconds, to wait for a response to an update request. | |
| 74 static const int kV4TimerUpdateWaitSecMax = 30; | |
| 75 | |
| 73 // The default V4UpdateProtocolManagerFactory. | 76 // The default V4UpdateProtocolManagerFactory. |
| 74 class V4UpdateProtocolManagerFactoryImpl | 77 class V4UpdateProtocolManagerFactoryImpl |
| 75 : public V4UpdateProtocolManagerFactory { | 78 : public V4UpdateProtocolManagerFactory { |
| 76 public: | 79 public: |
| 77 V4UpdateProtocolManagerFactoryImpl() {} | 80 V4UpdateProtocolManagerFactoryImpl() {} |
| 78 ~V4UpdateProtocolManagerFactoryImpl() override {} | 81 ~V4UpdateProtocolManagerFactoryImpl() override {} |
| 79 std::unique_ptr<V4UpdateProtocolManager> CreateProtocolManager( | 82 std::unique_ptr<V4UpdateProtocolManager> CreateProtocolManager( |
| 80 net::URLRequestContextGetter* request_context_getter, | 83 net::URLRequestContextGetter* request_context_getter, |
| 81 const V4ProtocolConfig& config, | 84 const V4ProtocolConfig& config, |
| 82 V4UpdateCallback callback) override { | 85 V4UpdateCallback callback) override { |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 243 response.minimum_wait_duration().seconds(); | 246 response.minimum_wait_duration().seconds(); |
| 244 | 247 |
| 245 // Do not let the next_update_interval_ to be too low. | 248 // Do not let the next_update_interval_ to be too low. |
| 246 if (minimum_wait_duration_seconds < kV4TimerStartIntervalSecMin) { | 249 if (minimum_wait_duration_seconds < kV4TimerStartIntervalSecMin) { |
| 247 minimum_wait_duration_seconds = kV4TimerStartIntervalSecMin; | 250 minimum_wait_duration_seconds = kV4TimerStartIntervalSecMin; |
| 248 } | 251 } |
| 249 next_update_interval_ = | 252 next_update_interval_ = |
| 250 base::TimeDelta::FromSeconds(minimum_wait_duration_seconds); | 253 base::TimeDelta::FromSeconds(minimum_wait_duration_seconds); |
| 251 } | 254 } |
| 252 | 255 |
| 253 // TODO(vakh): Do something useful with this response. | |
| 254 for (ListUpdateResponse& list_update_response : | 256 for (ListUpdateResponse& list_update_response : |
| 255 *response.mutable_list_update_responses()) { | 257 *response.mutable_list_update_responses()) { |
| 256 if (!list_update_response.has_platform_type()) { | 258 if (!list_update_response.has_platform_type()) { |
| 257 RecordParseUpdateResult(NO_PLATFORM_TYPE_ERROR); | 259 RecordParseUpdateResult(NO_PLATFORM_TYPE_ERROR); |
| 258 } else if (!list_update_response.has_threat_entry_type()) { | 260 } else if (!list_update_response.has_threat_entry_type()) { |
| 259 RecordParseUpdateResult(NO_THREAT_ENTRY_TYPE_ERROR); | 261 RecordParseUpdateResult(NO_THREAT_ENTRY_TYPE_ERROR); |
| 260 } else if (!list_update_response.has_threat_type()) { | 262 } else if (!list_update_response.has_threat_type()) { |
| 261 RecordParseUpdateResult(NO_THREAT_TYPE_ERROR); | 263 RecordParseUpdateResult(NO_THREAT_TYPE_ERROR); |
| 262 } else if (!list_update_response.has_new_client_state()) { | 264 } else if (!list_update_response.has_new_client_state()) { |
| 263 RecordParseUpdateResult(NO_STATE_ERROR); | 265 RecordParseUpdateResult(NO_STATE_ERROR); |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 288 url_fetcher_id_++, update_url, net::URLFetcher::GET, this); | 290 url_fetcher_id_++, update_url, net::URLFetcher::GET, this); |
| 289 fetcher->SetExtraRequestHeaders(headers.ToString()); | 291 fetcher->SetExtraRequestHeaders(headers.ToString()); |
| 290 data_use_measurement::DataUseUserData::AttachToFetcher( | 292 data_use_measurement::DataUseUserData::AttachToFetcher( |
| 291 fetcher.get(), data_use_measurement::DataUseUserData::SAFE_BROWSING); | 293 fetcher.get(), data_use_measurement::DataUseUserData::SAFE_BROWSING); |
| 292 | 294 |
| 293 request_.reset(fetcher.release()); | 295 request_.reset(fetcher.release()); |
| 294 | 296 |
| 295 request_->SetLoadFlags(net::LOAD_DISABLE_CACHE); | 297 request_->SetLoadFlags(net::LOAD_DISABLE_CACHE); |
| 296 request_->SetRequestContext(request_context_getter_.get()); | 298 request_->SetRequestContext(request_context_getter_.get()); |
| 297 request_->Start(); | 299 request_->Start(); |
| 298 // TODO(vakh): Handle request timeout. | 300 |
| 301 // Begin the update request timeout. | |
| 302 timeout_timer_.Start(FROM_HERE, | |
| 303 TimeDelta::FromSeconds(kV4TimerUpdateWaitSecMax), this, | |
| 304 &V4UpdateProtocolManager::HandleTimeout); | |
| 305 } | |
| 306 | |
| 307 void V4UpdateProtocolManager::HandleTimeout() { | |
| 308 request_.reset(); | |
|
Nathan Parker
2016/11/02 21:56:57
This should log some UMA value to indicate the req
vakh (use Gerrit instead)
2016/11/02 22:37:22
I thought about it but I couldn't find a good way
Nathan Parker
2016/11/05 00:32:21
Yes, you can use a UMA_HISTOGRAM just as a counter
| |
| 309 IssueUpdateRequest(); | |
|
Nathan Parker
2016/11/02 21:56:57
This will keep trying every 30 seconds. Is that wh
Scott Hess - ex-Googler
2016/11/02 22:05:08
Does the spec address this? I see language about
vakh (use Gerrit instead)
2016/11/02 22:37:22
Sure, that's possible. But what happens after that
vakh (use Gerrit instead)
2016/11/02 22:37:22
No, I don't see it: https://developers.google.com/
vakh (use Gerrit instead)
2016/11/08 17:51:40
Changed the code to schedule a normal update after
| |
| 299 } | 310 } |
| 300 | 311 |
| 301 // net::URLFetcherDelegate implementation ---------------------------------- | 312 // net::URLFetcherDelegate implementation ---------------------------------- |
| 302 | 313 |
| 303 // SafeBrowsing request responses are handled here. | 314 // SafeBrowsing request responses are handled here. |
| 304 void V4UpdateProtocolManager::OnURLFetchComplete( | 315 void V4UpdateProtocolManager::OnURLFetchComplete( |
| 305 const net::URLFetcher* source) { | 316 const net::URLFetcher* source) { |
| 306 DCHECK(CalledOnValidThread()); | 317 DCHECK(CalledOnValidThread()); |
| 307 | 318 |
| 319 timeout_timer_.Stop(); | |
| 320 | |
| 308 int response_code = source->GetResponseCode(); | 321 int response_code = source->GetResponseCode(); |
| 309 net::URLRequestStatus status = source->GetStatus(); | 322 net::URLRequestStatus status = source->GetStatus(); |
| 310 V4ProtocolManagerUtil::RecordHttpResponseOrErrorCode( | 323 V4ProtocolManagerUtil::RecordHttpResponseOrErrorCode( |
| 311 "SafeBrowsing.V4UpdateHttpResponseOrErrorCode", status, response_code); | 324 "SafeBrowsing.V4UpdateHttpResponseOrErrorCode", status, response_code); |
| 312 | 325 |
| 313 last_response_time_ = Time::Now(); | 326 last_response_time_ = Time::Now(); |
| 314 | 327 |
| 315 std::unique_ptr<ParsedServerResponse> parsed_server_response( | 328 std::unique_ptr<ParsedServerResponse> parsed_server_response( |
| 316 new ParsedServerResponse); | 329 new ParsedServerResponse); |
| 317 if (status.is_success() && response_code == net::HTTP_OK) { | 330 if (status.is_success() && response_code == net::HTTP_OK) { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 352 | 365 |
| 353 void V4UpdateProtocolManager::GetUpdateUrlAndHeaders( | 366 void V4UpdateProtocolManager::GetUpdateUrlAndHeaders( |
| 354 const std::string& req_base64, | 367 const std::string& req_base64, |
| 355 GURL* gurl, | 368 GURL* gurl, |
| 356 net::HttpRequestHeaders* headers) const { | 369 net::HttpRequestHeaders* headers) const { |
| 357 V4ProtocolManagerUtil::GetRequestUrlAndHeaders( | 370 V4ProtocolManagerUtil::GetRequestUrlAndHeaders( |
| 358 req_base64, "threatListUpdates:fetch", config_, gurl, headers); | 371 req_base64, "threatListUpdates:fetch", config_, gurl, headers); |
| 359 } | 372 } |
| 360 | 373 |
| 361 } // namespace safe_browsing | 374 } // namespace safe_browsing |
| OLD | NEW |