1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CONTENT_BROWSER_RESOLVE_PROXY_MSG_HELPER_H_ 6 #define CONTENT_BROWSER_RESOLVE_PROXY_MSG_HELPER_H_ 7 8 #include <deque> 9 #include <string> 10 11 #include "base/memory/ref_counted.h" 12 #include "content/common/content_export.h" 13 #include "content/public/browser/browser_message_filter.h" 14 #include "net/base/completion_callback.h" 15 #include "net/proxy/proxy_service.h" 16 #include "url/gurl.h" 17 18 namespace net { 19 class URLRequestContextGetter; 20 } 21 22 namespace content { 23 24 // Responds to ChildProcessHostMsg_ResolveProxy, kicking off a ProxyResolve 25 // request on the IO thread using the specified proxy service. Completion is 26 // notified through the delegate. If multiple requests are started at the same 27 // time, they will run in FIFO order, with only 1 being outstanding at a time. 28 // 29 // When an instance of ResolveProxyMsgHelper is destroyed, it cancels any 30 // outstanding proxy resolve requests with the proxy service. It also deletes 31 // the stored IPC::Message pointers for pending requests. 32 // 33 // This object is expected to live on the IO thread. 34 class CONTENT_EXPORT ResolveProxyMsgHelper : public BrowserMessageFilter { 35 public: 36 explicit ResolveProxyMsgHelper(net::URLRequestContextGetter* getter); 37 // Constructor used by unittests. 38 explicit ResolveProxyMsgHelper(net::ProxyService* proxy_service); 39 40 // BrowserMessageFilter implementation 41 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 42 43 void OnResolveProxy(const GURL& url, IPC::Message* reply_msg); 44 45 protected: 46 // Destruction cancels the current outstanding request, and clears the 47 // pending queue. 48 virtual ~ResolveProxyMsgHelper(); 49 50 private: 51 // Callback for the ProxyService (bound to |callback_|). 52 void OnResolveProxyCompleted(int result); 53 54 // Starts the first pending request. 55 void StartPendingRequest(); 56 57 // A PendingRequest is a resolve request that is in progress, or queued. 58 struct PendingRequest { 59 public: PendingRequestPendingRequest60 PendingRequest(const GURL& url, IPC::Message* reply_msg) : 61 url(url), reply_msg(reply_msg), pac_req(NULL) { } 62 63 // The URL of the request. 64 GURL url; 65 66 // Data to pass back to the delegate on completion (we own it until then). 67 IPC::Message* reply_msg; 68 69 // Handle for cancelling the current request if it has started (else NULL). 70 net::ProxyService::PacRequest* pac_req; 71 }; 72 73 // Info about the current outstanding proxy request. 74 net::ProxyInfo proxy_info_; 75 76 // FIFO queue of pending requests. The first entry is always the current one. 77 typedef std::deque<PendingRequest> PendingRequestList; 78 PendingRequestList pending_requests_; 79 80 scoped_refptr<net::URLRequestContextGetter> context_getter_; 81 net::ProxyService* proxy_service_; 82 }; 83 84 } // namespace content 85 86 #endif // CONTENT_BROWSER_RESOLVE_PROXY_MSG_HELPER_H_ 87