 Chromium Code Reviews
 Chromium Code Reviews Issue 1153093002:
  Implement URLRequestBackoffManager for managing Backoff headers  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master
    
  
    Issue 1153093002:
  Implement URLRequestBackoffManager for managing Backoff headers  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master| Index: net/url_request/url_request_backoff_manager.h | 
| diff --git a/net/url_request/url_request_backoff_manager.h b/net/url_request/url_request_backoff_manager.h | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..6d91293494e5fe4c8e3ddad7a0e9f12d6f34fd3d | 
| --- /dev/null | 
| +++ b/net/url_request/url_request_backoff_manager.h | 
| @@ -0,0 +1,136 @@ | 
| +// Copyright 2015 The Chromium Authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +#ifndef NET_URL_REQUEST_URL_REQUEST_BACKOFF_MANAGER_H_ | 
| +#define NET_URL_REQUEST_URL_REQUEST_BACKOFF_MANAGER_H_ | 
| + | 
| +#include <map> | 
| +#include <string> | 
| + | 
| +#include "base/basictypes.h" | 
| +#include "base/threading/non_thread_safe.h" | 
| +#include "base/time/time.h" | 
| +#include "net/base/net_export.h" | 
| +#include "net/base/network_change_notifier.h" | 
| +#include "url/gurl.h" | 
| + | 
| +namespace net { | 
| + | 
| +class HttpResponseHeaders; | 
| + | 
| +// Class that manages information on Backoff headers. URL requests for HTTP | 
| 
cpu_(ooo_6.6-7.5)
2015/07/17 19:56:01
"url requests for HTTP" --> HTTPS ?
 
xunjieli
2015/07/20 20:02:12
Done.
 | 
| +// contents should register their URLs in this manager on each request. | 
| +// | 
| +// Design doc: | 
| +// https://docs.google.com/document/d/1aAxwXK7Vw3VigFd6MmrItbAIgMdKAf-XxXXbhWXdID0/edit?usp=sharing | 
| 
cpu_(ooo_6.6-7.5)
2015/07/17 19:56:01
Getting error trying to open that.
com.google.app
 
xunjieli
2015/07/20 20:02:12
Done. Changed permission to no signin required. Co
 | 
| +// | 
| +// URLRequestBackoffManager maintains a map of URL IDs to | 
| +// URLRequestBackoffManager::Entry. It creates an entry when a request receives | 
| +// a Backoff header, and does garbage collection from time to time in order to | 
| +// clean out outdated entries. URL ID consists of lowercased scheme, host, port | 
| +// and path. A newer request with the same ID will override the old entry. | 
| +// | 
| +// Note that the class does not implement logic to retry a request at random | 
| +// with uniform distribution. | 
| +// TODO(xunjieli): Expose release time so that the caller can retry accordingly. | 
| +class NET_EXPORT URLRequestBackoffManager | 
| + : NON_EXPORTED_BASE(public base::NonThreadSafe), | 
| + public NetworkChangeNotifier::IPAddressObserver, | 
| + public NetworkChangeNotifier::ConnectionTypeObserver { | 
| + public: | 
| + // Minimum number of seconds that a Backoff header can specify. | 
| + static const uint16 kMinimumBackoffInSeconds; | 
| + // Maximum number of seconds that a Backoff header can specify. | 
| + static const uint16 kMaximumBackoffInSeconds; | 
| + // Number of throttled requests that will be made between garbage collection. | 
| + static const uint16 kNewEntriesBetweenCollecting; | 
| + | 
| + URLRequestBackoffManager(); | 
| + ~URLRequestBackoffManager() override; | 
| + | 
| + // Updates internal states with a response. | 
| + void UpdateWithResponse(const GURL& url, | 
| + HttpResponseHeaders* headers, | 
| + const base::Time& response_time); | 
| + | 
| + // Returns whether the request should be rejected because of a Backoff header. | 
| + bool ShouldRejectRequest(const GURL& url, const base::Time& request_time); | 
| + | 
| + // IPAddressObserver implementation. | 
| + void OnIPAddressChanged() override; | 
| + | 
| + // ConnectionTypeObserver implementation. | 
| + void OnConnectionTypeChanged( | 
| + NetworkChangeNotifier::ConnectionType type) override; | 
| + | 
| + // Used by tests. | 
| + int GetNumberOfEntriesForTests() const; | 
| + | 
| + private: | 
| + // An struct that holds relevant information obtained from a Backoff header. | 
| + struct Entry { | 
| + Entry(const base::Time& time1, const base::Time& time2) | 
| + : throttled_time(time1), release_time(time2), used(false) {} | 
| + ~Entry() {} | 
| + | 
| + // Returns whether this entry is outdated. | 
| + bool IsOutDated() { return base::Time::Now() >= release_time; } | 
| + | 
| + // Before this time, requests with the same URL ID should be throttled. | 
| + const base::Time throttled_time; | 
| + | 
| + // Only one request with the same URL ID should be allowed in | 
| + // [|throttled_time|, |release_time|). | 
| + // After this time, all requests with the same URL ID are allowed. | 
| + const base::Time release_time; | 
| + | 
| + // Indicates whether a request has been made in | 
| + // [|throttled_time|, |release_time|). | 
| + bool used; | 
| + }; | 
| + | 
| + // From each URL, generate an ID composed of the scheme, host, port and path | 
| + // that allows unique mapping an entry to it. | 
| + typedef std::map<std::string, Entry*> UrlEntryMap; | 
| + | 
| + // Method that ensures the map gets cleaned from time to time. The period at | 
| + // which garbage collecting happens is adjustable with the | 
| + // kNewEntriesBetweenCollecting constant. | 
| + void GarbageCollectEntriesIfNecessary(); | 
| + | 
| + // Return true if there is a well-formed Backoff header key-value pair, | 
| + // and write the Backoff header value in |result|. Return false if no header | 
| + // is found or the value is invalid (i.e. less than kMinimumBackoffInSeconds | 
| + // or greater than kMaximumBackoffInSeconds). | 
| + bool GetBackoffTime(HttpResponseHeaders* headers, | 
| + base::TimeDelta* result) const; | 
| + | 
| + // Method that transforms a URL into an ID that can be used in the map. | 
| + // Resulting IDs will be lowercase and consist of the scheme, host, port | 
| + // and path (without query string, fragment, etc.). | 
| + // If the URL is invalid, the invalid spec will be returned, without any | 
| + // transformation. | 
| + std::string GetIdFromUrl(const GURL& url) const; | 
| + | 
| + // When switching from online to offline or change IP addresses, | 
| + // clear all back-off history. This is a precaution in case the change in | 
| + // online state now allows communicating without errors with servers that | 
| + // were previously returning Backoff headers. | 
| + void OnNetworkChange(); | 
| + | 
| + UrlEntryMap url_entries_; | 
| + | 
| + // Keeps track of how many new entries are created since last garbage | 
| + // collection. | 
| + unsigned int new_entries_since_last_gc_; | 
| + | 
| + // Valid after construction. | 
| + GURL::Replacements url_id_replacements_; | 
| + | 
| + DISALLOW_COPY_AND_ASSIGN(URLRequestBackoffManager); | 
| +}; | 
| + | 
| +} // namespace net | 
| + | 
| +#endif // NET_URL_REQUEST_URL_REQUEST_BACKOFF_MANAGER_H_ |