Index: net/proxy/proxy_service.h |
=================================================================== |
--- net/proxy/proxy_service.h (revision 21630) |
+++ net/proxy/proxy_service.h (working copy) |
@@ -5,11 +5,12 @@ |
#ifndef NET_PROXY_PROXY_SERVICE_H_ |
#define NET_PROXY_PROXY_SERVICE_H_ |
-#include <deque> |
#include <string> |
+#include <vector> |
#include "base/ref_counted.h" |
#include "base/scoped_ptr.h" |
+// TODO(eroman): remove this unused header; other callers are depending on it! |
#include "base/thread.h" |
#include "base/waitable_event.h" |
#include "net/base/completion_callback.h" |
@@ -17,6 +18,7 @@ |
#include "net/proxy/proxy_info.h" |
class GURL; |
+class MessageLoop; |
class URLRequestContext; |
namespace net { |
@@ -27,7 +29,7 @@ |
// This class can be used to resolve the proxy server to use when loading a |
// HTTP(S) URL. It uses the given ProxyResolver to handle the actual proxy |
-// resolution. See ProxyResolverWinHttp for example. |
+// resolution. See ProxyResolverV8 for example. |
class ProxyService { |
public: |
// The instance takes ownership of |config_service| and |resolver|. |
@@ -37,6 +39,7 @@ |
~ProxyService(); |
// Used internally to handle PAC queries. |
+ // TODO(eroman): consider naming this simply "Request". |
class PacRequest; |
// Returns ERR_IO_PENDING if the proxy information could not be provided |
@@ -57,6 +60,7 @@ |
// 2. PAC URL |
// 3. WPAD auto-detection |
// |
+ // TODO(eroman): see http://crbug.com/9985; the outline above is too simple. |
int ResolveProxy(const GURL& url, |
ProxyInfo* results, |
CompletionCallback* callback, |
@@ -126,6 +130,11 @@ |
private: |
friend class PacRequest; |
+ // TODO(eroman): change this to a std::set. Note that this requires updating |
+ // some tests in proxy_service_unittest.cc such as: |
+ // ProxyServiceTest.InitialPACScriptDownload |
+ // which expects requests to finish in the order they were added. |
+ typedef std::vector<scoped_refptr<PacRequest> > PendingRequests; |
// Creates a config service appropriate for this platform that fetches the |
// system proxy settings. |
@@ -136,9 +145,6 @@ |
// on V8. |
static ProxyResolver* CreateNonV8ProxyResolver(); |
- ProxyResolver* resolver() { return resolver_.get(); } |
- base::Thread* pac_thread() { return pac_thread_.get(); } |
- |
// Identifies the proxy configuration. |
ProxyConfig::ID config_id() const { return config_.id(); } |
@@ -170,7 +176,6 @@ |
// Returns ERR_IO_PENDING if the request cannot be completed synchronously. |
// Otherwise it fills |result| with the proxy information for |url|. |
// Completing synchronously means we don't need to query ProxyResolver. |
- // (ProxyResolver runs on PAC thread.) |
int TryToCompleteSynchronously(const GURL& url, ProxyInfo* result); |
// Set |result| with the proxy to use for |url|, based on |rules|. |
@@ -178,18 +183,21 @@ |
const ProxyConfig::ProxyRules& rules, |
ProxyInfo* result); |
- // Starts the PAC thread if it isn't already running. |
- void InitPacThread(); |
+ // Sends all the unstarted pending requests off to the resolver. |
+ void ResumeAllPendingRequests(); |
- // Starts the next request from |pending_requests_| is possible. |
- // |recent_req| is the request that just got added, or NULL. |
- void ProcessPendingRequests(PacRequest* recent_req); |
+ // Returns true if |pending_requests_| contains |req|. |
+ bool ContainsPendingRequest(PacRequest* req); |
- // Removes the front entry of the requests queue. |expected_req| is our |
- // expectation of what the front of the request queue is; it is only used by |
- // DCHECK for verification purposes. |
- void RemoveFrontOfRequestQueue(PacRequest* expected_req); |
+ // Removes |req| from the list of pending requests. |
+ void RemovePendingRequest(PacRequest* req); |
+ // Returns true if the resolver is all set-up and ready to accept requests. |
+ // Returns false if requests are blocked (because the PAC script is being |
+ // downloaded). May have the side-effect of starting the PAC script |
+ // download. |
+ bool PrepareResolverForRequests(); |
+ |
// Called to indicate that a PacRequest completed. The |config_id| parameter |
// indicates the proxy configuration that was queried. |result_code| is OK |
// if the PAC file could be downloaded and executed. Otherwise, it is an |
@@ -204,7 +212,6 @@ |
scoped_ptr<ProxyConfigService> config_service_; |
scoped_ptr<ProxyResolver> resolver_; |
- scoped_ptr<base::Thread> pac_thread_; |
// We store the proxy config and a counter (ID) that is incremented each time |
// the config changes. |
@@ -222,9 +229,8 @@ |
// Map of the known bad proxies and the information about the retry time. |
ProxyRetryInfoMap proxy_retry_info_; |
- // FIFO queue of pending/inprogress requests. |
- typedef std::deque<scoped_refptr<PacRequest> > PendingRequestsQueue; |
- PendingRequestsQueue pending_requests_; |
+ // Set of pending/inprogress requests. |
+ PendingRequests pending_requests_; |
// The fetcher to use when downloading PAC scripts for the ProxyResolver. |
// This dependency can be NULL if our ProxyResolver has no need for |