Index: net/url_request/url_request_throttler_manager.cc |
diff --git a/net/url_request/url_request_throttler_manager.cc b/net/url_request/url_request_throttler_manager.cc |
deleted file mode 100644 |
index 8a62884b70bbc552494f4d53ef06173fd6491a85..0000000000000000000000000000000000000000 |
--- a/net/url_request/url_request_throttler_manager.cc |
+++ /dev/null |
@@ -1,203 +0,0 @@ |
-// Copyright (c) 2012 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. |
- |
-#include "net/url_request/url_request_throttler_manager.h" |
- |
-#include "base/logging.h" |
-#include "base/metrics/field_trial.h" |
-#include "base/metrics/histogram.h" |
-#include "base/strings/string_util.h" |
-#include "net/base/net_log.h" |
-#include "net/base/net_util.h" |
- |
-namespace net { |
- |
-const unsigned int URLRequestThrottlerManager::kMaximumNumberOfEntries = 1500; |
-const unsigned int URLRequestThrottlerManager::kRequestsBetweenCollecting = 200; |
- |
-URLRequestThrottlerManager::URLRequestThrottlerManager() |
- : requests_since_last_gc_(0), |
- enable_thread_checks_(false), |
- logged_for_localhost_disabled_(false), |
- registered_from_thread_(base::kInvalidThreadId) { |
- url_id_replacements_.ClearPassword(); |
- url_id_replacements_.ClearUsername(); |
- url_id_replacements_.ClearQuery(); |
- url_id_replacements_.ClearRef(); |
- |
- NetworkChangeNotifier::AddIPAddressObserver(this); |
- NetworkChangeNotifier::AddConnectionTypeObserver(this); |
-} |
- |
-URLRequestThrottlerManager::~URLRequestThrottlerManager() { |
- NetworkChangeNotifier::RemoveIPAddressObserver(this); |
- NetworkChangeNotifier::RemoveConnectionTypeObserver(this); |
- |
- // Since the manager object might conceivably go away before the |
- // entries, detach the entries' back-pointer to the manager. |
- UrlEntryMap::iterator i = url_entries_.begin(); |
- while (i != url_entries_.end()) { |
- if (i->second.get() != NULL) { |
- i->second->DetachManager(); |
- } |
- ++i; |
- } |
- |
- // Delete all entries. |
- url_entries_.clear(); |
-} |
- |
-scoped_refptr<URLRequestThrottlerEntryInterface> |
- URLRequestThrottlerManager::RegisterRequestUrl(const GURL &url) { |
- DCHECK(!enable_thread_checks_ || CalledOnValidThread()); |
- |
- // Normalize the url. |
- std::string url_id = GetIdFromUrl(url); |
- |
- // Periodically garbage collect old entries. |
- GarbageCollectEntriesIfNecessary(); |
- |
- // Find the entry in the map or create a new NULL entry. |
- scoped_refptr<URLRequestThrottlerEntry>& entry = url_entries_[url_id]; |
- |
- // If the entry exists but could be garbage collected at this point, we |
- // start with a fresh entry so that we possibly back off a bit less |
- // aggressively (i.e. this resets the error count when the entry's URL |
- // hasn't been requested in long enough). |
- if (entry.get() && entry->IsEntryOutdated()) { |
- entry = NULL; |
- } |
- |
- // Create the entry if needed. |
- if (entry.get() == NULL) { |
- entry = new URLRequestThrottlerEntry(this, url_id); |
- |
- // We only disable back-off throttling on an entry that we have |
- // just constructed. This is to allow unit tests to explicitly override |
- // the entry for localhost URLs. Given that we do not attempt to |
- // disable throttling for entries already handed out (see comment |
- // in AddToOptOutList), this is not a problem. |
- std::string host = url.host(); |
- if (opt_out_hosts_.find(host) != opt_out_hosts_.end() || |
- IsLocalhost(host)) { |
- if (!logged_for_localhost_disabled_ && IsLocalhost(host)) { |
- logged_for_localhost_disabled_ = true; |
- net_log_.AddEvent(NetLog::TYPE_THROTTLING_DISABLED_FOR_HOST, |
- NetLog::StringCallback("host", &host)); |
- } |
- |
- // TODO(joi): Once sliding window is separate from back-off throttling, |
- // we can simply return a dummy implementation of |
- // URLRequestThrottlerEntryInterface here that never blocks anything (and |
- // not keep entries in url_entries_ for opted-out sites). |
- entry->DisableBackoffThrottling(); |
- } |
- } |
- |
- return entry; |
-} |
- |
-void URLRequestThrottlerManager::AddToOptOutList(const std::string& host) { |
- // There is an edge case here that we are not handling, to keep things |
- // simple. If a host starts adding the opt-out header to its responses |
- // after there are already one or more entries in url_entries_ for that |
- // host, the pre-existing entries may still perform back-off throttling. |
- // In practice, this would almost never occur. |
- if (opt_out_hosts_.find(host) == opt_out_hosts_.end()) { |
- UMA_HISTOGRAM_COUNTS("Throttling.SiteOptedOut", 1); |
- |
- net_log_.EndEvent(NetLog::TYPE_THROTTLING_DISABLED_FOR_HOST, |
- NetLog::StringCallback("host", &host)); |
- opt_out_hosts_.insert(host); |
- } |
-} |
- |
-void URLRequestThrottlerManager::OverrideEntryForTests( |
- const GURL& url, |
- URLRequestThrottlerEntry* entry) { |
- // Normalize the url. |
- std::string url_id = GetIdFromUrl(url); |
- |
- // Periodically garbage collect old entries. |
- GarbageCollectEntriesIfNecessary(); |
- |
- url_entries_[url_id] = entry; |
-} |
- |
-void URLRequestThrottlerManager::EraseEntryForTests(const GURL& url) { |
- // Normalize the url. |
- std::string url_id = GetIdFromUrl(url); |
- url_entries_.erase(url_id); |
-} |
- |
-void URLRequestThrottlerManager::set_enable_thread_checks(bool enable) { |
- enable_thread_checks_ = enable; |
-} |
- |
-bool URLRequestThrottlerManager::enable_thread_checks() const { |
- return enable_thread_checks_; |
-} |
- |
-void URLRequestThrottlerManager::set_net_log(NetLog* net_log) { |
- DCHECK(net_log); |
- net_log_ = BoundNetLog::Make(net_log, |
- NetLog::SOURCE_EXPONENTIAL_BACKOFF_THROTTLING); |
-} |
- |
-NetLog* URLRequestThrottlerManager::net_log() const { |
- return net_log_.net_log(); |
-} |
- |
-void URLRequestThrottlerManager::OnIPAddressChanged() { |
- OnNetworkChange(); |
-} |
- |
-void URLRequestThrottlerManager::OnConnectionTypeChanged( |
- NetworkChangeNotifier::ConnectionType type) { |
- OnNetworkChange(); |
-} |
- |
-std::string URLRequestThrottlerManager::GetIdFromUrl(const GURL& url) const { |
- if (!url.is_valid()) |
- return url.possibly_invalid_spec(); |
- |
- GURL id = url.ReplaceComponents(url_id_replacements_); |
- return base::StringToLowerASCII(id.spec()).c_str(); |
-} |
- |
-void URLRequestThrottlerManager::GarbageCollectEntriesIfNecessary() { |
- requests_since_last_gc_++; |
- if (requests_since_last_gc_ < kRequestsBetweenCollecting) |
- return; |
- requests_since_last_gc_ = 0; |
- |
- GarbageCollectEntries(); |
-} |
- |
-void URLRequestThrottlerManager::GarbageCollectEntries() { |
- UrlEntryMap::iterator i = url_entries_.begin(); |
- while (i != url_entries_.end()) { |
- if ((i->second)->IsEntryOutdated()) { |
- url_entries_.erase(i++); |
- } else { |
- ++i; |
- } |
- } |
- |
- // In case something broke we want to make sure not to grow indefinitely. |
- while (url_entries_.size() > kMaximumNumberOfEntries) { |
- url_entries_.erase(url_entries_.begin()); |
- } |
-} |
- |
-void URLRequestThrottlerManager::OnNetworkChange() { |
- // Remove all entries. Any entries that in-flight requests have a reference |
- // to will live until those requests end, and these entries may be |
- // inconsistent with new entries for the same URLs, but since what we |
- // want is a clean slate for the new connection type, this is OK. |
- url_entries_.clear(); |
- requests_since_last_gc_ = 0; |
-} |
- |
-} // namespace net |