Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 #ifndef NET_URL_REQUEST_URL_REQUEST_THROTTLER_MANAGER_H_ | 5 #ifndef NET_URL_REQUEST_URL_REQUEST_THROTTLER_MANAGER_H_ |
| 6 #define NET_URL_REQUEST_URL_REQUEST_THROTTLER_MANAGER_H_ | 6 #define NET_URL_REQUEST_URL_REQUEST_THROTTLER_MANAGER_H_ |
| 7 #pragma once | 7 #pragma once |
| 8 | 8 |
| 9 #include <map> | 9 #include <map> |
| 10 #include <set> | 10 #include <set> |
| 11 #include <string> | 11 #include <string> |
| 12 | 12 |
| 13 #include "base/basictypes.h" | 13 #include "base/basictypes.h" |
| 14 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/scoped_ptr.h" |
| 15 #include "base/memory/singleton.h" | 15 #include "base/memory/singleton.h" |
| 16 #include "base/threading/non_thread_safe.h" | 16 #include "base/threading/non_thread_safe.h" |
| 17 #include "googleurl/src/gurl.h" | 17 #include "googleurl/src/gurl.h" |
| 18 #include "net/base/net_api.h" | 18 #include "net/base/net_api.h" |
| 19 #include "net/base/network_change_notifier.h" | |
| 19 #include "net/url_request/url_request_throttler_entry.h" | 20 #include "net/url_request/url_request_throttler_entry.h" |
| 20 | 21 |
| 21 namespace net { | 22 namespace net { |
| 22 | 23 |
| 24 class BoundNetLog; | |
| 25 class NetLog; | |
| 26 | |
| 23 // Class that registers URL request throttler entries for URLs being accessed | 27 // Class that registers URL request throttler entries for URLs being accessed |
| 24 // in order to supervise traffic. URL requests for HTTP contents should | 28 // in order to supervise traffic. URL requests for HTTP contents should |
| 25 // register their URLs in this manager on each request. | 29 // register their URLs in this manager on each request. |
| 26 // | 30 // |
| 27 // URLRequestThrottlerManager maintains a map of URL IDs to URL request | 31 // URLRequestThrottlerManager maintains a map of URL IDs to URL request |
| 28 // throttler entries. It creates URL request throttler entries when new URLs | 32 // throttler entries. It creates URL request throttler entries when new URLs |
| 29 // are registered, and does garbage collection from time to time in order to | 33 // are registered, and does garbage collection from time to time in order to |
| 30 // clean out outdated entries. URL ID consists of lowercased scheme, host, port | 34 // clean out outdated entries. URL ID consists of lowercased scheme, host, port |
| 31 // and path. All URLs converted to the same ID will share the same entry. | 35 // and path. All URLs converted to the same ID will share the same entry. |
| 32 // | 36 // |
| 33 // NOTE: All usage of this singleton object must be on the same thread, | 37 // NOTE: All usage of this singleton object must be on the same thread, |
| 34 // although to allow it to be used as a singleton, construction and destruction | 38 // although to allow it to be used as a singleton, construction and destruction |
| 35 // can occur on a separate thread. | 39 // can occur on a separate thread. |
| 36 class NET_API URLRequestThrottlerManager | 40 class URLRequestThrottlerManager |
|
wtc
2011/05/25 23:12:06
IMPORTANT: this is a merging error. Please add ba
Jói
2011/05/26 14:53:42
Fixed. Thanks for catching that.
| |
| 37 : NON_EXPORTED_BASE(public base::NonThreadSafe) { | 41 : NON_EXPORTED_BASE(public base::NonThreadSafe), |
| 42 public NetworkChangeNotifier::IPAddressObserver, | |
| 43 public NetworkChangeNotifier::OnlineStateObserver { | |
| 38 public: | 44 public: |
| 39 static URLRequestThrottlerManager* GetInstance(); | 45 static URLRequestThrottlerManager* GetInstance(); |
| 40 | 46 |
| 41 // Must be called for every request, returns the URL request throttler entry | 47 // Must be called for every request, returns the URL request throttler entry |
| 42 // associated with the URL. The caller must inform this entry of some events. | 48 // associated with the URL. The caller must inform this entry of some events. |
| 43 // Please refer to url_request_throttler_entry_interface.h for further | 49 // Please refer to url_request_throttler_entry_interface.h for further |
| 44 // informations. | 50 // informations. |
| 45 scoped_refptr<URLRequestThrottlerEntryInterface> RegisterRequestUrl( | 51 scoped_refptr<URLRequestThrottlerEntryInterface> RegisterRequestUrl( |
| 46 const GURL& url); | 52 const GURL& url); |
| 47 | 53 |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 64 // Turns threading model verification on or off. Any code that correctly | 70 // Turns threading model verification on or off. Any code that correctly |
| 65 // uses the network stack should preferably call this function to enable | 71 // uses the network stack should preferably call this function to enable |
| 66 // verification of correct adherence to the network stack threading model. | 72 // verification of correct adherence to the network stack threading model. |
| 67 void set_enable_thread_checks(bool enable); | 73 void set_enable_thread_checks(bool enable); |
| 68 bool enable_thread_checks() const; | 74 bool enable_thread_checks() const; |
| 69 | 75 |
| 70 // Whether throttling is enabled or not. | 76 // Whether throttling is enabled or not. |
| 71 void set_enforce_throttling(bool enforce); | 77 void set_enforce_throttling(bool enforce); |
| 72 bool enforce_throttling(); | 78 bool enforce_throttling(); |
| 73 | 79 |
| 80 // Sets the NetLog instance to use. | |
| 81 void set_net_log(NetLog* net_log); | |
| 82 NetLog* net_log() const; | |
| 83 | |
| 84 // IPAddressObserver interface. | |
| 85 virtual void OnIPAddressChanged() OVERRIDE; | |
| 86 | |
| 87 // OnlineStateObserver interface. | |
| 88 virtual void OnOnlineStateChanged(bool online) OVERRIDE; | |
| 89 | |
| 74 protected: | 90 protected: |
| 75 URLRequestThrottlerManager(); | 91 URLRequestThrottlerManager(); |
| 76 ~URLRequestThrottlerManager(); | 92 ~URLRequestThrottlerManager(); |
| 77 | 93 |
| 78 // Method that allows us to transform a URL into an ID that can be used in our | 94 // Method that allows us to transform a URL into an ID that can be used in our |
| 79 // map. Resulting IDs will be lowercase and consist of the scheme, host, port | 95 // map. Resulting IDs will be lowercase and consist of the scheme, host, port |
| 80 // and path (without query string, fragment, etc.). | 96 // and path (without query string, fragment, etc.). |
| 81 // If the URL is invalid, the invalid spec will be returned, without any | 97 // If the URL is invalid, the invalid spec will be returned, without any |
| 82 // transformation. | 98 // transformation. |
| 83 std::string GetIdFromUrl(const GURL& url) const; | 99 std::string GetIdFromUrl(const GURL& url) const; |
| 84 | 100 |
| 85 // Method that ensures the map gets cleaned from time to time. The period at | 101 // Method that ensures the map gets cleaned from time to time. The period at |
| 86 // which garbage collecting happens is adjustable with the | 102 // which garbage collecting happens is adjustable with the |
| 87 // kRequestBetweenCollecting constant. | 103 // kRequestBetweenCollecting constant. |
| 88 void GarbageCollectEntriesIfNecessary(); | 104 void GarbageCollectEntriesIfNecessary(); |
| 89 | 105 |
| 90 // Method that does the actual work of garbage collecting. | 106 // Method that does the actual work of garbage collecting. |
| 91 void GarbageCollectEntries(); | 107 void GarbageCollectEntries(); |
| 92 | 108 |
| 109 // When we switch from online to offline or change IP addresses, we | |
| 110 // clear all back-off history. This is a precaution in case the change in | |
| 111 // online state now lets us communicate without error with servers that | |
| 112 // we were previously getting 500 or 503 responses from (perhaps the | |
| 113 // responses are from a badly-written proxy that should have returned a | |
| 114 // 502 or 504 because it's upstream connection was down or it had no route | |
| 115 // to the server). | |
| 116 void OnNetworkChange(); | |
| 117 | |
| 93 // Used by tests. | 118 // Used by tests. |
| 94 int GetNumberOfEntriesForTests() const { return url_entries_.size(); } | 119 int GetNumberOfEntriesForTests() const { return url_entries_.size(); } |
| 95 | 120 |
| 96 private: | 121 private: |
| 97 friend struct DefaultSingletonTraits<URLRequestThrottlerManager>; | 122 friend struct DefaultSingletonTraits<URLRequestThrottlerManager>; |
| 98 | 123 |
| 99 // From each URL we generate an ID composed of the scheme, host, port and path | 124 // From each URL we generate an ID composed of the scheme, host, port and path |
| 100 // that allows us to uniquely map an entry to it. | 125 // that allows us to uniquely map an entry to it. |
| 101 typedef std::map<std::string, scoped_refptr<URLRequestThrottlerEntry> > | 126 typedef std::map<std::string, scoped_refptr<URLRequestThrottlerEntry> > |
| 102 UrlEntryMap; | 127 UrlEntryMap; |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 129 bool enforce_throttling_; | 154 bool enforce_throttling_; |
| 130 | 155 |
| 131 // Certain tests do not obey the net component's threading policy, so we | 156 // Certain tests do not obey the net component's threading policy, so we |
| 132 // keep track of whether we're being used by tests, and turn off certain | 157 // keep track of whether we're being used by tests, and turn off certain |
| 133 // checks. | 158 // checks. |
| 134 // | 159 // |
| 135 // TODO(joi): See if we can fix the offending unit tests and remove this | 160 // TODO(joi): See if we can fix the offending unit tests and remove this |
| 136 // workaround. | 161 // workaround. |
| 137 bool enable_thread_checks_; | 162 bool enable_thread_checks_; |
| 138 | 163 |
| 164 // Initially false, switches to true once we have logged because of back-off | |
| 165 // being disabled for localhost. | |
| 166 bool logged_for_localhost_disabled_; | |
| 167 | |
| 168 // NetLog to use, or NULL if none configured. | |
| 169 scoped_ptr<BoundNetLog> net_log_; | |
| 170 | |
| 139 DISALLOW_COPY_AND_ASSIGN(URLRequestThrottlerManager); | 171 DISALLOW_COPY_AND_ASSIGN(URLRequestThrottlerManager); |
| 140 }; | 172 }; |
| 141 | 173 |
| 142 } // namespace net | 174 } // namespace net |
| 143 | 175 |
| 144 #endif // NET_URL_REQUEST_URL_REQUEST_THROTTLER_MANAGER_H_ | 176 #endif // NET_URL_REQUEST_URL_REQUEST_THROTTLER_MANAGER_H_ |
| OLD | NEW |