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.
5 #ifndef COMPONENTS_DATA_REDUCTION_PROXY_BROWSER_DATA_REDUCTION_PROXY_PARAMS_H_
6 #define COMPONENTS_DATA_REDUCTION_PROXY_BROWSER_DATA_REDUCTION_PROXY_PARAMS_H_
12 #include "base/memory/scoped_ptr.h"
13 #include "net/base/host_port_pair.h"
14 #include "net/proxy/proxy_retry_info.h"
26 namespace data_reduction_proxy
{
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
;
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
{
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);
58 typedef std::vector
<GURL
> DataReductionProxyList
;
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();
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();
68 // Returns true if this client is part of a field trial that uses preconnect
70 static bool IsIncludedInPreconnectHintingFieldTrial();
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();
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
81 static bool IsIncludedInHoldbackFieldTrial();
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();
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
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
);
104 // Creates a copy of the configuration parameters.
105 scoped_ptr
<DataReductionProxyParams
> Clone();
107 virtual ~DataReductionProxyParams();
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;
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;
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
136 bool IsBypassedByDataReductionProxyLocalRules(
137 const net::URLRequest
& request
,
138 const net::ProxyConfig
& data_reduction_proxy_config
) const;
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;
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
,
157 base::TimeDelta
* min_retry_delay
) const;
159 // Returns the data reduction proxy primary origin.
160 const GURL
& origin() const {
164 // Returns the data reduction proxy fallback origin.
165 const GURL
& fallback_origin() const {
166 return fallback_origin_
;
169 // Returns the data reduction proxy ssl origin that is used with the
170 // alternative proxy configuration.
171 const GURL
& ssl_origin() const {
175 // Returns the alternative data reduction proxy primary origin.
176 const GURL
& alt_origin() const {
180 // Returns the alternative data reduction proxy fallback origin.
181 const GURL
& alt_fallback_origin() const {
182 return alt_fallback_origin_
;
185 // Returns the URL to probe to decide if the primary origin should be used.
186 const GURL
& probe_url() const {
190 // Returns the URL to fetch to warm the data reduction proxy connection.
191 const GURL
& warmup_url() const {
195 // Returns true if the data reduction proxy configuration may be used.
196 bool allowed() const {
200 // Returns true if the fallback proxy may be used.
201 bool fallback_allowed() const {
202 return fallback_allowed_
;
205 // Returns true if the alternative data reduction proxy configuration may be
207 bool alternative_allowed() const {
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_
;
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_
;
224 // Returns true if the data reduction proxy should not actually use the
226 bool holdback() const {
230 // Given |allowed_|, |fallback_allowed_|, and |alt_allowed_|, returns the
231 // list of data reduction proxies that may be used.
232 DataReductionProxyList
GetAllowedProxies() const;
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_
;
240 // Test constructor that optionally won't call Init();
241 DataReductionProxyParams(int flags
,
242 bool should_call_init
);
244 DataReductionProxyParams(const DataReductionProxyParams
& params
);
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
,
252 bool alt_fallback_allowed
);
254 // Initialize the values of the proxies, and probe URL from command
255 // line flags and preprocessor constants.
256 void InitWithoutChecks();
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;
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
,
278 const GURL
& fallback
,
279 base::TimeDelta
* min_retry_delay
) const;
281 DataReductionProxyParams
& operator=(const DataReductionProxyParams
& params
);
284 GURL fallback_origin_
;
287 GURL alt_fallback_origin_
;
292 bool fallback_allowed_
;
294 bool alt_fallback_allowed_
;
298 bool configured_on_command_line_
;
301 } // namespace data_reduction_proxy
302 #endif // COMPONENTS_DATA_REDUCTION_PROXY_BROWSER_DATA_REDUCTION_PROXY_PARAMS_H_