Home | History | Annotate | Download | only in browser
      1 // Copyright 2014 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 COMPONENTS_DATA_REDUCTION_PROXY_BROWSER_DATA_REDUCTION_PROXY_PARAMS_H_
      6 #define COMPONENTS_DATA_REDUCTION_PROXY_BROWSER_DATA_REDUCTION_PROXY_PARAMS_H_
      7 
      8 #include <string>
      9 #include <utility>
     10 #include <vector>
     11 
     12 #include "base/memory/scoped_ptr.h"
     13 #include "net/base/host_port_pair.h"
     14 #include "net/proxy/proxy_retry_info.h"
     15 #include "url/gurl.h"
     16 
     17 namespace base {
     18 class TimeDelta;
     19 }
     20 
     21 namespace net {
     22 class ProxyConfig;
     23 class URLRequest;
     24 }
     25 
     26 namespace data_reduction_proxy {
     27 
     28 // Contains information about a given proxy server. |proxy_servers| contains
     29 // the configured data reduction proxy servers. |is_fallback|, |is_alternative|
     30 // and |is_ssl| note whether the given proxy is a fallback, an alternative,
     31 // or a proxy for ssl; these are not mutually exclusive.
     32 struct DataReductionProxyTypeInfo {
     33   DataReductionProxyTypeInfo();
     34   ~DataReductionProxyTypeInfo();
     35   std::pair<GURL, GURL> proxy_servers;
     36   bool is_fallback;
     37   bool is_alternative;
     38   bool is_ssl;
     39 };
     40 
     41 // Provides initialization parameters. Proxy origins, and the probe url are
     42 // are taken from flags if available and from preprocessor constants otherwise.
     43 // The DataReductionProxySettings class and others use this class to determine
     44 // the necessary DNS names to configure use of the data reduction proxy.
     45 class DataReductionProxyParams {
     46  public:
     47   // Flags used during construction that specify if the data reduction proxy
     48   // is allowed to be used, if the fallback proxy is allowed to be used, if
     49   // an alternative set of proxies is allowed to be used, if the promotion is
     50   // allowed to be shown, and if this instance is part of a holdback experiment.
     51   static const unsigned int kAllowed = (1 << 0);
     52   static const unsigned int kFallbackAllowed = (1 << 1);
     53   static const unsigned int kAlternativeAllowed = (1 << 2);
     54   static const unsigned int kAlternativeFallbackAllowed = (1 << 3);
     55   static const unsigned int kPromoAllowed = (1 << 4);
     56   static const unsigned int kHoldback = (1 << 5);
     57 
     58   typedef std::vector<GURL> DataReductionProxyList;
     59 
     60   // Returns true if this client is part of field trial to use an alternative
     61   // configuration for the data reduction proxy.
     62   static bool IsIncludedInAlternativeFieldTrial();
     63 
     64   // Returns true if this client is part of the field trial that should display
     65   // a promotion for the data reduction proxy.
     66   static bool IsIncludedInPromoFieldTrial();
     67 
     68   // Returns true if this client is part of a field trial that uses preconnect
     69   // hinting.
     70   static bool IsIncludedInPreconnectHintingFieldTrial();
     71 
     72   // Returns true if this client is part of a field trial that bypasses the
     73   // proxy if the request resource type is on the critical path (e.g. HTML).
     74   static bool IsIncludedInCriticalPathBypassFieldTrial();
     75 
     76   // Returns true if this client is part of a field trial that runs a holdback
     77   // experiment. A holdback experiment is one in which a fraction of browser
     78   // instances will not be configured to use the data reduction proxy even if
     79   // users have enabled it to be used. The UI will not indicate that a holdback
     80   // is in effect.
     81   static bool IsIncludedInHoldbackFieldTrial();
     82 
     83   // Returns true if this client is part of a field trial that removes the
     84   // |MISSING_VIA_HEADER_OTHER| proxy bypass case. This experiment changes proxy
     85   // bypass logic to not trigger a proxy bypass when a response with a non-4xx
     86   // response code is expected to have a data reduction proxy via header, but
     87   // the data reduction proxy via header is missing.
     88   static bool IsIncludedInRemoveMissingViaHeaderOtherBypassFieldTrial();
     89 
     90   // Constructs configuration parameters. If |kAllowed|, then the standard
     91   // data reduction proxy configuration is allowed to be used. If
     92   // |kfallbackAllowed| a fallback proxy can be used if the primary proxy is
     93   // bypassed or disabled. If |kAlternativeAllowed| then an alternative proxy
     94   // configuration is allowed to be used. This alternative configuration would
     95   // replace the primary and fallback proxy configurations if enabled. Finally
     96   // if |kPromoAllowed|, the client may show a promotion for the data reduction
     97   // proxy.
     98   //
     99   // A standard configuration has a primary proxy, and a fallback proxy for
    100   // HTTP traffic. The alternative configuration has a different primary and
    101   // fallback proxy for HTTP traffic, and an SSL proxy.
    102   explicit DataReductionProxyParams(int flags);
    103 
    104   // Creates a copy of the configuration parameters.
    105   scoped_ptr<DataReductionProxyParams> Clone();
    106 
    107   virtual ~DataReductionProxyParams();
    108 
    109   // Returns true if a data reduction proxy was used for the given |request|.
    110   // If true, |proxy_info.proxy_servers.first| will contain the name of the
    111   // proxy that was used. |proxy_info.proxy_servers.second| will contain the
    112   // name of the data reduction proxy server that would be used if
    113   // |proxy_info.proxy_server.first| is bypassed, if one exists. In addition,
    114   // |proxy_info| will note if the proxy used was a fallback, an alternative,
    115   // or a proxy for ssl; these are not mutually exclusive. |proxy_info| can be
    116   // NULL if the caller isn't interested in its values.
    117   virtual bool WasDataReductionProxyUsed(
    118       const net::URLRequest* request,
    119       DataReductionProxyTypeInfo* proxy_info) const;
    120 
    121   // Returns true if the specified |host_port_pair| matches a data reduction
    122   // proxy. If true, |proxy_info.proxy_servers.first| will contain the name of
    123   // the proxy that matches. |proxy_info.proxy_servers.second| will contain the
    124   // name of the data reduction proxy server that would be used if
    125   // |proxy_info.proxy_server.first| is bypassed, if one exists. In addition,
    126   // |proxy_info| will note if the proxy was a fallback, an alternative, or a
    127   // proxy for ssl; these are not mutually exclusive. |proxy_info| can be NULL
    128   // if the caller isn't interested in its values. Virtual for testing.
    129   virtual bool IsDataReductionProxy(
    130       const net::HostPortPair& host_port_pair,
    131       DataReductionProxyTypeInfo* proxy_info) const;
    132 
    133   // Returns true if this request would be bypassed by the data request proxy
    134   // based on applying the |data_reduction_proxy_config| param rules to the
    135   // request URL.
    136   bool IsBypassedByDataReductionProxyLocalRules(
    137       const net::URLRequest& request,
    138       const net::ProxyConfig& data_reduction_proxy_config) const;
    139 
    140   // Checks if all configured data reduction proxies are in the retry map.
    141   // Returns true if the request is bypassed by all configured data reduction
    142   // proxies and returns the bypass delay in delay_seconds (if not NULL). If
    143   // there are no configured data reduction proxies, returns false. If
    144   // the request is bypassed by more than one proxy, delay_seconds returns
    145   // the shortest delay.
    146   bool AreDataReductionProxiesBypassed(const net::URLRequest& request,
    147                                        base::TimeDelta* min_retry_delay) const;
    148 
    149   // Checks if all configured data reduction proxies are in the retry map.
    150   // Returns true if the request is bypassed by all configured data reduction
    151   // proxies and returns the bypass delay in delay_seconds (if not NULL). If
    152   // there are no configured data reduction proxies, returns false. If
    153   // the request is bypassed by more than one proxy, delay_seconds returns
    154   // the shortest delay.
    155   bool AreProxiesBypassed(const net::ProxyRetryInfoMap& retry_map,
    156                           bool is_https,
    157                           base::TimeDelta* min_retry_delay) const;
    158 
    159   // Returns the data reduction proxy primary origin.
    160   const GURL& origin() const {
    161     return origin_;
    162   }
    163 
    164   // Returns the data reduction proxy fallback origin.
    165   const GURL& fallback_origin() const {
    166     return fallback_origin_;
    167   }
    168 
    169   // Returns the data reduction proxy ssl origin that is used with the
    170   // alternative proxy configuration.
    171   const GURL& ssl_origin() const {
    172     return ssl_origin_;
    173   }
    174 
    175   // Returns the alternative data reduction proxy primary origin.
    176   const GURL& alt_origin() const {
    177     return alt_origin_;
    178   }
    179 
    180   // Returns the alternative data reduction proxy fallback origin.
    181   const GURL& alt_fallback_origin() const {
    182     return alt_fallback_origin_;
    183   }
    184 
    185   // Returns the URL to probe to decide if the primary origin should be used.
    186   const GURL& probe_url() const {
    187     return probe_url_;
    188   }
    189 
    190   // Returns the URL to fetch to warm the data reduction proxy connection.
    191   const GURL& warmup_url() const {
    192     return warmup_url_;
    193   }
    194 
    195   // Returns true if the data reduction proxy configuration may be used.
    196   bool allowed() const {
    197     return allowed_;
    198   }
    199 
    200   // Returns true if the fallback proxy may be used.
    201   bool fallback_allowed() const {
    202     return fallback_allowed_;
    203   }
    204 
    205   // Returns true if the alternative data reduction proxy configuration may be
    206   // used.
    207   bool alternative_allowed() const {
    208     return alt_allowed_;
    209   }
    210 
    211   // Returns true if the alternative fallback data reduction proxy
    212   // configuration may be used.
    213   bool alternative_fallback_allowed() const {
    214     return alt_fallback_allowed_;
    215   }
    216 
    217   // Returns true if the data reduction proxy promo may be shown.
    218   // This is idependent of whether the data reduction proxy is allowed.
    219   // TODO(bengr): maybe tie to whether proxy is allowed.
    220   bool promo_allowed() const {
    221     return promo_allowed_;
    222   }
    223 
    224   // Returns true if the data reduction proxy should not actually use the
    225   // proxy if enabled.
    226   bool holdback() const {
    227     return holdback_;
    228   }
    229 
    230   // Given |allowed_|, |fallback_allowed_|, and |alt_allowed_|, returns the
    231   // list of data reduction proxies that may be used.
    232   DataReductionProxyList GetAllowedProxies() const;
    233 
    234   // Returns true if any proxy origins are set on the command line.
    235   bool is_configured_on_command_line() const {
    236     return configured_on_command_line_;
    237   }
    238 
    239  protected:
    240   // Test constructor that optionally won't call Init();
    241   DataReductionProxyParams(int flags,
    242                            bool should_call_init);
    243 
    244   DataReductionProxyParams(const DataReductionProxyParams& params);
    245 
    246   // Initialize the values of the proxies, and probe URL, from command
    247   // line flags and preprocessor constants, and check that there are
    248   // corresponding definitions for the allowed configurations.
    249   bool Init(bool allowed,
    250             bool fallback_allowed,
    251             bool alt_allowed,
    252             bool alt_fallback_allowed);
    253 
    254   // Initialize the values of the proxies, and probe URL from command
    255   // line flags and preprocessor constants.
    256   void InitWithoutChecks();
    257 
    258   // Returns the corresponding string from preprocessor constants if defined,
    259   // and an empty string otherwise.
    260   virtual std::string GetDefaultDevOrigin() const;
    261   virtual std::string GetDefaultDevFallbackOrigin() const;
    262   virtual std::string GetDefaultOrigin() const;
    263   virtual std::string GetDefaultFallbackOrigin() const;
    264   virtual std::string GetDefaultSSLOrigin() const;
    265   virtual std::string GetDefaultAltOrigin() const;
    266   virtual std::string GetDefaultAltFallbackOrigin() const;
    267   virtual std::string GetDefaultProbeURL() const;
    268   virtual std::string GetDefaultWarmupURL() const;
    269 
    270  private:
    271   // Checks if the primary and fallback data reduction proxies are in the retry
    272   // map. Returns true if the request is bypassed by both data reduction
    273   // proxies and returns the shortest bypass delay in delay_seconds (if not
    274   // NULL). If the fallback proxy is not valid, returns true if primary proxy
    275   // was bypassed and returns its bypass delay.
    276   bool ArePrimaryAndFallbackBypassed(const net::ProxyRetryInfoMap& retry_map,
    277                                      const GURL& primary,
    278                                      const GURL& fallback,
    279                                      base::TimeDelta* min_retry_delay) const;
    280 
    281   DataReductionProxyParams& operator=(const DataReductionProxyParams& params);
    282 
    283   GURL origin_;
    284   GURL fallback_origin_;
    285   GURL ssl_origin_;
    286   GURL alt_origin_;
    287   GURL alt_fallback_origin_;
    288   GURL probe_url_;
    289   GURL warmup_url_;
    290 
    291   bool allowed_;
    292   bool fallback_allowed_;
    293   bool alt_allowed_;
    294   bool alt_fallback_allowed_;
    295   bool promo_allowed_;
    296   bool holdback_;
    297 
    298   bool configured_on_command_line_;
    299 };
    300 
    301 }  // namespace data_reduction_proxy
    302 #endif  // COMPONENTS_DATA_REDUCTION_PROXY_BROWSER_DATA_REDUCTION_PROXY_PARAMS_H_
    303