Index: net/http/winhttp_request_throttle.h |
=================================================================== |
--- net/http/winhttp_request_throttle.h (revision 7967) |
+++ net/http/winhttp_request_throttle.h (working copy) |
@@ -1,104 +0,0 @@ |
-// Copyright (c) 2006-2008 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_HTTP_WINHTTP_REQUEST_THROTTLE_H_ |
-#define NET_HTTP_WINHTTP_REQUEST_THROTTLE_H_ |
- |
-#include <windows.h> |
-#include <winhttp.h> |
- |
-#include <map> |
-#include <string> |
- |
-#include "base/basictypes.h" |
-#include "base/linked_ptr.h" |
-#include "testing/gtest/include/gtest/gtest_prod.h" |
- |
-namespace net { |
- |
-// The WinHttpRequestThrottle class regulates the rate at which we call |
-// WinHttpSendRequest, ensuring that at any time there are at most 6 WinHTTP |
-// requests in progress for each server or proxy. |
-// |
-// The throttling is intended to cause WinHTTP to maintain at most 6 |
-// persistent HTTP connections with each server or proxy. This works well in |
-// most cases, except when making HTTPS requests via a proxy, in which case |
-// WinHTTP may open much more than 6 connections to the proxy in spite of our |
-// rate limiting. |
-// |
-// Because we identify a server by its hostname rather than its IP address, |
-// we also can't distinguish between two different hostnames that resolve to |
-// the same IP address. |
-// |
-// Although WinHTTP has the WINHTTP_OPTION_MAX_CONNS_PER_SERVER option to |
-// limit the number of connections allowed per server, we can't use it |
-// because it has two serious bugs: |
-// 1. It causes WinHTTP to not close idle persistent connections, leaving |
-// many connections in the CLOSE_WAIT state. This may cause system |
-// crashes (Blue Screen of Death) when VPN is used. |
-// 2. It causes WinHTTP to crash intermittently in |
-// HTTP_REQUEST_HANDLE_OBJECT::OpenProxyTunnel_Fsm() if a proxy is used. |
-// Therefore, we have to resort to throttling our WinHTTP requests to achieve |
-// the same effect. |
-// |
-// Note on thread safety: The WinHttpRequestThrottle class is only used by |
-// the IO thread, so it doesn't need to be protected with a lock. The |
-// drawback is that the time we mark a request done is only approximate. |
-// We do that in the HttpTransactionWinHttp destructor, rather than in the |
-// WinHTTP status callback upon receiving HANDLE_CLOSING. |
-class WinHttpRequestThrottle { |
- public: |
- WinHttpRequestThrottle() {} |
- |
- virtual ~WinHttpRequestThrottle(); |
- |
- // Intended to be a near drop-in replacement of WinHttpSendRequest. |
- BOOL SubmitRequest(const std::string& server, |
- HINTERNET request_handle, |
- DWORD total_size, |
- DWORD_PTR context); |
- |
- // Called when a request failed or completed successfully. |
- void NotifyRequestDone(const std::string& server); |
- |
- // Called from the HttpTransactionWinHttp destructor. |
- void RemoveRequest(const std::string& server, |
- HINTERNET request_handle); |
- |
- protected: |
- // Unit tests can stub out this method in a derived class. |
- virtual BOOL SendRequest(HINTERNET request_handle, |
- DWORD total_size, |
- DWORD_PTR context, |
- bool report_async_error); |
- |
- private: |
- FRIEND_TEST(WinHttpRequestThrottleTest, GarbageCollect); |
- |
- class RequestQueue; |
- |
- struct PerServerThrottle { |
- PerServerThrottle(); |
- ~PerServerThrottle(); |
- |
- int num_requests; // Number of requests in progress |
- linked_ptr<RequestQueue> request_queue; // Requests waiting to be sent |
- }; |
- |
- typedef std::map<std::string, PerServerThrottle> ThrottleMap; |
- |
- static const int kMaxConnectionsPerServer; |
- static const int kGarbageCollectionThreshold; |
- |
- void GarbageCollect(); |
- |
- ThrottleMap throttles_; |
- |
- DISALLOW_EVIL_CONSTRUCTORS(WinHttpRequestThrottle); |
-}; |
- |
-} // namespace net |
- |
-#endif // NET_HTTP_WINHTTP_REQUEST_THROTTLE_H_ |
- |