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, 42 bool* message_was_ok) OVERRIDE; 43 44 void OnResolveProxy(const GURL& url, IPC::Message* reply_msg); 45 46 protected: 47 // Destruction cancels the current outstanding request, and clears the 48 // pending queue. 49 virtual ~ResolveProxyMsgHelper(); 50 51 private: 52 // Callback for the ProxyService (bound to |callback_|). 53 void OnResolveProxyCompleted(int result); 54 55 // Starts the first pending request. 56 void StartPendingRequest(); 57 58 // A PendingRequest is a resolve request that is in progress, or queued. 59 struct PendingRequest { 60 public: PendingRequestPendingRequest61 PendingRequest(const GURL& url, IPC::Message* reply_msg) : 62 url(url), reply_msg(reply_msg), pac_req(NULL) { } 63 64 // The URL of the request. 65 GURL url; 66 67 // Data to pass back to the delegate on completion (we own it until then). 68 IPC::Message* reply_msg; 69 70 // Handle for cancelling the current request if it has started (else NULL). 71 net::ProxyService::PacRequest* pac_req; 72 }; 73 74 // Info about the current outstanding proxy request. 75 net::ProxyInfo proxy_info_; 76 77 // FIFO queue of pending requests. The first entry is always the current one. 78 typedef std::deque<PendingRequest> PendingRequestList; 79 PendingRequestList pending_requests_; 80 81 scoped_refptr<net::URLRequestContextGetter> context_getter_; 82 net::ProxyService* proxy_service_; 83 }; 84 85 } // namespace content 86 87 #endif // CONTENT_BROWSER_RESOLVE_PROXY_MSG_HELPER_H_ 88