| // Copyright 2013 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 CHROME_BROWSER_NET_SPDYPROXY_PROXY_ADVISOR_H_ |
| #define CHROME_BROWSER_NET_SPDYPROXY_PROXY_ADVISOR_H_ |
| |
| #include <set> |
| |
| #include "base/prefs/pref_member.h" |
| #include "chrome/browser/net/url_info.h" |
| #include "net/url_request/url_request.h" |
| |
| namespace net { |
| class URLRequestContextGetter; |
| } |
| |
| class PrefService; |
| |
| // Accessory class for net/preconnect to be used in conjunction with the |
| // data reduction proxy. An instance of this class will accept Advise() |
| // calls and will send HEAD requests to an endpoint URL on the proxy |
| // which notify the proxy of preconnection opportunities. |
| // The HEAD requests have a header of the form: |
| // Proxy-Host-Advisory: <motivation> <url> |
| // Where <motivation> is a string describing what is motivating the |
| // preconnection ('learned_referral', 'omnibox', etc.). |
| // |
| // The ProxyAdvisor owns the HEAD requests. Since we don't care about any |
| // responses from the requests, they are deleted as soon as a response |
| // code is received. |
| // |
| // ProxyAdvisor monitors the state of the proxy preference; if it is |
| // disabled, all in-flight requests are canceled. |
| // |
| // ProxyAdvisor instances should be created on the UI thread. |
| class ProxyAdvisor : public net::URLRequest::Delegate { |
| public: |
| ProxyAdvisor(PrefService* pref_service, |
| net::URLRequestContextGetter* context_getter); |
| virtual ~ProxyAdvisor(); |
| |
| // net::URLRequest::Delegate callbacks. |
| virtual void OnResponseStarted(net::URLRequest* request) OVERRIDE; |
| virtual void OnReadCompleted(net::URLRequest* request, |
| int bytes_read) OVERRIDE; |
| |
| // Tell the advisor that |url| is being preconnected or pre-resolved and why. |
| // If |url| would be proxied (according to WouldProxyURL()), the ProxyAdvisor |
| // will send a HEAD request to the proxy, giving it an opportunity to |
| // preconnect or pre-resolve hostnames prior to the browser sending actual |
| // requests. |
| // If WouldProxyURL returns a false positive, then Advise() will send an |
| // advisory HEAD request to the proxy, but |url| will be fetched by the |
| // browser directly. |
| // |motivation| and |is_preconnect| are used to determine a motivation string |
| // that is passed as part of the request (if |is_preconnect| is false, the |
| // advisory is interprered as being of lower priority). |
| // Advise() may only be called on the IO thread. |
| virtual void Advise(const GURL& url, |
| chrome_browser_net::UrlInfo::ResolutionMotivation motivation, |
| bool is_preconnect); |
| |
| // Returns true if, under the current proxy settings, |url| is likely to be |
| // proxied. This is quick and dirty, rather that doing full proxy resolution |
| // (which may involve PAC file execution and checking bad proxy lists). |
| // TODO(marq): Make this method part of DataReductionProxySettings. |
| virtual bool WouldProxyURL(const GURL& url); |
| |
| private: |
| // Removes |request| from |inflight_requests_|. |
| void RequestComplete(net::URLRequest* request); |
| |
| // Checks prefs::kSpdyProxyAuthEnabled and updates |proxy_enabled_| |
| // accordingly. If the proxy has turned off, cancels all inflight requests. |
| void UpdateProxyState(); |
| |
| scoped_refptr<net::URLRequestContextGetter> context_getter_; |
| |
| BooleanPrefMember proxy_pref_member_; |
| |
| std::set<net::URLRequest*> inflight_requests_; |
| }; |
| |
| #endif // CHROME_BROWSER_NET_SPDYPROXY_PROXY_ADVISOR_H_ |
| |