root/chrome/browser/net/spdyproxy/proxy_advisor.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


// 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_


/* [<][>][^][v][top][bottom][index][help] */