146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file.
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/data_reduction_proxy/browser/data_reduction_proxy_params.h"
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include <vector>
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/command_line.h"
106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/metrics/field_trial.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/time/time.h"
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/data_reduction_proxy/common/data_reduction_proxy_switches.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "net/base/host_port_pair.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/proxy/proxy_config.h"
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/proxy/proxy_info.h"
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "net/proxy/proxy_retry_info.h"
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "net/proxy/proxy_server.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/proxy/proxy_service.h"
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "net/url_request/url_request.h"
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/url_request/url_request_context.h"
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "url/url_constants.h"
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using base::FieldTrialList;
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace {
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const char kEnabled[] = "Enabled";
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kDefaultOrigin[] = "https://proxy.googlezip.net:443/";
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kDevOrigin[] = "https://proxy-dev.googlezip.net:443/";
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kDevFallbackOrigin[] = "http://proxy-dev.googlezip.net:80/";
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kDefaultFallbackOrigin[] = "http://compress.googlezip.net:80/";
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// This is for a proxy that supports HTTP CONNECT to tunnel SSL traffic.
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The proxy listens on port 443, but uses the HTTP protocol to set up
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// the tunnel, not HTTPS.
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kDefaultSslOrigin[] = "http://ssl.googlezip.net:443/";
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kDefaultAltOrigin[] = "http://ssl.googlezip.net:80/";
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kDefaultAltFallbackOrigin[] = "http://ssl.googlezip.net:80/";
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kDefaultProbeUrl[] = "http://check.googlezip.net/connect";
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kDefaultWarmupUrl[] = "http://www.gstatic.com/generate_204";
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace data_reduction_proxy {
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// static
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool DataReductionProxyParams::IsIncludedInAlternativeFieldTrial() {
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string group_name = base::FieldTrialList::FindFullName(
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "DataCompressionProxyAlternativeConfiguration");
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (CommandLine::ForCurrentProcess()->HasSwitch(
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          data_reduction_proxy::switches::kEnableDataReductionProxyAlt)) {
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return true;
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return group_name == kEnabled;
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// static
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool DataReductionProxyParams::IsIncludedInPromoFieldTrial() {
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return FieldTrialList::FindFullName(
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      "DataCompressionProxyPromoVisibility") == kEnabled;
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// static
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool DataReductionProxyParams::IsIncludedInPreconnectHintingFieldTrial() {
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return FieldTrialList::FindFullName(
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          "DataCompressionProxyPreconnectHints") == kEnabled;
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// static
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool DataReductionProxyParams::IsIncludedInCriticalPathBypassFieldTrial() {
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return FieldTrialList::FindFullName(
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          "DataCompressionProxyCriticalBypass") == kEnabled;
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool DataReductionProxyParams::IsIncludedInHoldbackFieldTrial() {
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return FieldTrialList::FindFullName(
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "DataCompressionProxyHoldback") == kEnabled;
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool DataReductionProxyParams::
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    IsIncludedInRemoveMissingViaHeaderOtherBypassFieldTrial() {
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return FieldTrialList::FindFullName(
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "DataReductionProxyRemoveMissingViaHeaderOtherBypass") == kEnabled;
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)DataReductionProxyTypeInfo::DataReductionProxyTypeInfo()
896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    : proxy_servers(),
906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      is_fallback(false),
916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      is_alternative(false),
926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      is_ssl(false) {
936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)DataReductionProxyTypeInfo::~DataReductionProxyTypeInfo(){
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)DataReductionProxyParams::DataReductionProxyParams(int flags)
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    : allowed_((flags & kAllowed) == kAllowed),
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      fallback_allowed_((flags & kFallbackAllowed) == kFallbackAllowed),
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      alt_allowed_((flags & kAlternativeAllowed) == kAlternativeAllowed),
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      alt_fallback_allowed_(
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          (flags & kAlternativeFallbackAllowed) == kAlternativeFallbackAllowed),
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      promo_allowed_((flags & kPromoAllowed) == kPromoAllowed),
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      holdback_((flags & kHoldback) == kHoldback),
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      configured_on_command_line_(false) {
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool result = Init(
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      allowed_, fallback_allowed_, alt_allowed_, alt_fallback_allowed_);
10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(result);
11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)scoped_ptr<DataReductionProxyParams> DataReductionProxyParams::Clone() {
1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return scoped_ptr<DataReductionProxyParams>(
1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      new DataReductionProxyParams(*this));
1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)DataReductionProxyParams::DataReductionProxyParams(
1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const DataReductionProxyParams& other)
1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    : origin_(other.origin_),
1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      fallback_origin_(other.fallback_origin_),
1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ssl_origin_(other.ssl_origin_),
1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      alt_origin_(other.alt_origin_),
1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      alt_fallback_origin_(other.alt_fallback_origin_),
1246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      probe_url_(other.probe_url_),
1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      warmup_url_(other.warmup_url_),
1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      allowed_(other.allowed_),
1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      fallback_allowed_(other.fallback_allowed_),
1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      alt_allowed_(other.alt_allowed_),
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      alt_fallback_allowed_(other.alt_fallback_allowed_),
1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      promo_allowed_(other.promo_allowed_),
1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      holdback_(other.holdback_),
1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      configured_on_command_line_(other.configured_on_command_line_) {
1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)DataReductionProxyParams::~DataReductionProxyParams() {
13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)DataReductionProxyParams::DataReductionProxyList
13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)DataReductionProxyParams::GetAllowedProxies() const {
14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DataReductionProxyList list;
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (allowed_) {
14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    list.push_back(origin_);
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (allowed_ && fallback_allowed_)
14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    list.push_back(fallback_origin_);
14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (alt_allowed_) {
14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    list.push_back(alt_origin_);
14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    list.push_back(ssl_origin_);
14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (alt_allowed_ && alt_fallback_allowed_)
15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    list.push_back(alt_fallback_origin_);
15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return list;
15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)DataReductionProxyParams::DataReductionProxyParams(int flags,
15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                                   bool should_call_init)
15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    : allowed_((flags & kAllowed) == kAllowed),
15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      fallback_allowed_((flags & kFallbackAllowed) == kFallbackAllowed),
15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      alt_allowed_((flags & kAlternativeAllowed) == kAlternativeAllowed),
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      alt_fallback_allowed_(
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          (flags & kAlternativeFallbackAllowed) == kAlternativeFallbackAllowed),
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      promo_allowed_((flags & kPromoAllowed) == kPromoAllowed),
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      holdback_((flags & kHoldback) == kHoldback),
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      configured_on_command_line_(false) {
16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (should_call_init) {
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool result = Init(
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        allowed_, fallback_allowed_, alt_allowed_, alt_fallback_allowed_);
16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    DCHECK(result);
16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool DataReductionProxyParams::Init(bool allowed,
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    bool fallback_allowed,
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    bool alt_allowed,
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    bool alt_fallback_allowed) {
17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  InitWithoutChecks();
17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Verify that all necessary params are set.
17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (allowed) {
17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (!origin_.is_valid()) {
18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      DVLOG(1) << "Invalid data reduction proxy origin: " << origin_.spec();
18146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return false;
18246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
18446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
18546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (allowed && fallback_allowed) {
18646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (!fallback_origin_.is_valid()) {
18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      DVLOG(1) << "Invalid data reduction proxy fallback origin: "
18846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          << fallback_origin_.spec();
18946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return false;
19046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
19146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
19246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
19346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (alt_allowed) {
19446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (!allowed) {
19546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      DVLOG(1) << "Alternative data reduction proxy configuration cannot "
19646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          << "be allowed if the regular configuration is not allowed";
19746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return false;
19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
19946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (!alt_origin_.is_valid()) {
20046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      DVLOG(1) << "Invalid alternative origin:" << alt_origin_.spec();
20146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return false;
20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
20346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (!ssl_origin_.is_valid()) {
20446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      DVLOG(1) << "Invalid ssl origin: " << ssl_origin_.spec();
20546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return false;
20646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
20746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
20846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (alt_allowed && alt_fallback_allowed) {
21046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (!alt_fallback_origin_.is_valid()) {
21146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      DVLOG(1) << "Invalid alternative fallback origin:"
21246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          << alt_fallback_origin_.spec();
21346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return false;
21446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
21546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
21646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
21746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (allowed && !probe_url_.is_valid()) {
21846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    DVLOG(1) << "Invalid probe url: <null>";
21946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
22046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
22146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
22246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (fallback_allowed_ && !allowed_) {
22346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    DVLOG(1) << "The data reduction proxy fallback cannot be allowed if "
22446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        << "the data reduction proxy is not allowed";
22546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
22646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (alt_fallback_allowed_ && !alt_allowed_) {
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DVLOG(1) << "The data reduction proxy alternative fallback cannot be "
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        << "allowed if the alternative data reduction proxy is not allowed";
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
23246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (promo_allowed_ && !allowed_) {
23346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    DVLOG(1) << "The data reduction proxy promo cannot be allowed if the "
23446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        << "data reduction proxy is not allowed";
23546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
23646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
23746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return true;
23846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
23946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
24046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
24146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void DataReductionProxyParams::InitWithoutChecks() {
24246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const CommandLine& command_line = *CommandLine::ForCurrentProcess();
243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string origin;
244f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!command_line.HasSwitch(switches::kDisableDataReductionProxyDev)) {
245f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      origin = command_line.GetSwitchValueASCII(
246f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          switches::kDataReductionProxyDev);
247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
24846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (origin.empty())
24946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    origin = command_line.GetSwitchValueASCII(switches::kDataReductionProxy);
25046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::string fallback_origin =
25146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      command_line.GetSwitchValueASCII(switches::kDataReductionProxyFallback);
25246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::string ssl_origin =
25346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      command_line.GetSwitchValueASCII(switches::kDataReductionSSLProxy);
25446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::string alt_origin =
25546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      command_line.GetSwitchValueASCII(switches::kDataReductionProxyAlt);
25646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::string alt_fallback_origin = command_line.GetSwitchValueASCII(
25746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      switches::kDataReductionProxyAltFallback);
25846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  configured_on_command_line_ =
26046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      !(origin.empty() && fallback_origin.empty() && ssl_origin.empty() &&
26146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          alt_origin.empty() && alt_fallback_origin.empty());
26246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
26346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
26446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Configuring the proxy on the command line overrides the values of
26546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // |allowed_| and |alt_allowed_|.
266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (configured_on_command_line_)
26746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    allowed_ = true;
26846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!(ssl_origin.empty() &&
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        alt_origin.empty()))
27046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    alt_allowed_ = true;
27146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
27246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::string probe_url = command_line.GetSwitchValueASCII(
27346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      switches::kDataReductionProxyProbeURL);
2746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  std::string warmup_url = command_line.GetSwitchValueASCII(
2756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      switches::kDataReductionProxyWarmupURL);
27646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
27746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Set from preprocessor constants those params that are not specified on the
27846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // command line.
27946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (origin.empty())
28046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    origin = GetDefaultDevOrigin();
28146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (origin.empty())
28246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    origin = GetDefaultOrigin();
28346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (fallback_origin.empty())
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    fallback_origin = GetDefaultDevFallbackOrigin();
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (fallback_origin.empty())
28646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fallback_origin = GetDefaultFallbackOrigin();
28746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (ssl_origin.empty())
28846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ssl_origin = GetDefaultSSLOrigin();
28946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (alt_origin.empty())
29046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    alt_origin = GetDefaultAltOrigin();
29146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (alt_fallback_origin.empty())
29246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    alt_fallback_origin = GetDefaultAltFallbackOrigin();
29346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (probe_url.empty())
29446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    probe_url = GetDefaultProbeURL();
2956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (warmup_url.empty())
2966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    warmup_url = GetDefaultWarmupURL();
29746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
29846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  origin_ = GURL(origin);
29946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  fallback_origin_ = GURL(fallback_origin);
30046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ssl_origin_ = GURL(ssl_origin);
30146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  alt_origin_ = GURL(alt_origin);
30246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  alt_fallback_origin_ = GURL(alt_fallback_origin);
30346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  probe_url_ = GURL(probe_url);
3046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  warmup_url_ = GURL(warmup_url);
30546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
30646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
30746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
308f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool DataReductionProxyParams::WasDataReductionProxyUsed(
309f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const net::URLRequest* request,
3106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DataReductionProxyTypeInfo* proxy_info) const {
311f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(request);
3126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return IsDataReductionProxy(request->proxy_server(), proxy_info);
313f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
314f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
315f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool DataReductionProxyParams::IsDataReductionProxy(
316f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const net::HostPortPair& host_port_pair,
3176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DataReductionProxyTypeInfo* proxy_info) const {
318f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (net::HostPortPair::FromURL(origin()).Equals(host_port_pair)) {
3196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (proxy_info) {
3206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      proxy_info->proxy_servers.first = origin();
321f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      if (fallback_allowed())
3226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        proxy_info->proxy_servers.second = fallback_origin();
323f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
324f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return true;
325f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
327f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (fallback_allowed() &&
328f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      net::HostPortPair::FromURL(fallback_origin()).Equals(host_port_pair)) {
3296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (proxy_info) {
3306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      proxy_info->proxy_servers.first = fallback_origin();
3316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      proxy_info->proxy_servers.second = GURL();
3326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      proxy_info->is_fallback = true;
333f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
334f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return true;
335f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
336f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (net::HostPortPair::FromURL(alt_origin()).Equals(host_port_pair)) {
3376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (proxy_info) {
3386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      proxy_info->proxy_servers.first = alt_origin();
3396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      proxy_info->is_alternative = true;
3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (alternative_fallback_allowed())
3416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        proxy_info->proxy_servers.second = alt_fallback_origin();
342f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
343f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return true;
344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (alternative_fallback_allowed() &&
346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      net::HostPortPair::FromURL(alt_fallback_origin()).Equals(
347f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      host_port_pair)) {
3486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (proxy_info) {
3496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      proxy_info->proxy_servers.first = alt_fallback_origin();
3506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      proxy_info->proxy_servers.second = GURL();
3516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      proxy_info->is_fallback = true;
3526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      proxy_info->is_alternative = true;
353f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
354f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return true;
355f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
356f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (net::HostPortPair::FromURL(ssl_origin()).Equals(host_port_pair)) {
3576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (proxy_info) {
3586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      proxy_info->proxy_servers.first = ssl_origin();
3596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      proxy_info->proxy_servers.second = GURL();
3606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      proxy_info->is_ssl = true;
361f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
362f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return true;
363f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
364f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return false;
365f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
366f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool DataReductionProxyParams::IsBypassedByDataReductionProxyLocalRules(
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const net::URLRequest& request,
3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const net::ProxyConfig& data_reduction_proxy_config) const {
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(request.context());
3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(request.context()->proxy_service());
372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  net::ProxyInfo result;
3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  data_reduction_proxy_config.proxy_rules().Apply(
3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      request.url(), &result);
375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!result.proxy_server().is_valid())
3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return true;
377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (result.proxy_server().is_direct())
3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return true;
3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return !IsDataReductionProxy(result.proxy_server().host_port_pair(), NULL);
38046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
38146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
38246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)std::string DataReductionProxyParams::GetDefaultDevOrigin() const {
383f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const CommandLine& command_line = *CommandLine::ForCurrentProcess();
384f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableDataReductionProxyDev))
385f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return std::string();
386f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableDataReductionProxyDev) ||
387f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      (FieldTrialList::FindFullName("DataCompressionProxyDevRollout") ==
388f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)         kEnabled)) {
3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return kDevOrigin;
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return std::string();
3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistd::string DataReductionProxyParams::GetDefaultDevFallbackOrigin() const {
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const CommandLine& command_line = *CommandLine::ForCurrentProcess();
3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (command_line.HasSwitch(switches::kDisableDataReductionProxyDev))
3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return std::string();
3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (command_line.HasSwitch(switches::kEnableDataReductionProxyDev) ||
3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      (FieldTrialList::FindFullName("DataCompressionProxyDevRollout") ==
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           kEnabled)) {
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return kDevFallbackOrigin;
40246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
40346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return std::string();
40446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
40546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool DataReductionProxyParams::AreDataReductionProxiesBypassed(
4075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const net::URLRequest& request, base::TimeDelta* min_retry_delay) const {
4085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (request.context() != NULL &&
4095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      request.context()->proxy_service() != NULL) {
4105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return AreProxiesBypassed(
4115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        request.context()->proxy_service()->proxy_retry_info(),
4125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        request.url().SchemeIs(url::kHttpsScheme),
4135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        min_retry_delay);
4145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
4155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return false;
4175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool DataReductionProxyParams::AreProxiesBypassed(
4205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const net::ProxyRetryInfoMap& retry_map,
4215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    bool is_https,
4225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    base::TimeDelta* min_retry_delay) const {
4235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (retry_map.size() == 0)
4245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return false;
4255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If the request is https, consider only the ssl proxy.
4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (is_https) {
4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (alt_allowed_) {
4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return ArePrimaryAndFallbackBypassed(
4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          retry_map, ssl_origin_, GURL(), min_retry_delay);
4311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NOTREACHED();
4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
4345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
4355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (allowed_ && ArePrimaryAndFallbackBypassed(
4375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      retry_map, origin_, fallback_origin_, min_retry_delay)) {
4385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return true;
4395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
4405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (alt_allowed_ && ArePrimaryAndFallbackBypassed(
4425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      retry_map, alt_origin_, alt_fallback_origin_, min_retry_delay)) {
4435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return true;
4445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
4455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return false;
4475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool DataReductionProxyParams::ArePrimaryAndFallbackBypassed(
4505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const net::ProxyRetryInfoMap& retry_map,
4515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const GURL& primary,
4525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const GURL& fallback,
4535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    base::TimeDelta* min_retry_delay) const {
4541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  net::ProxyRetryInfoMap::const_iterator found = retry_map.end();
4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (min_retry_delay)
4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *min_retry_delay = base::TimeDelta::Max();
4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Look for the primary proxy in the retry map. This must be done before
4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // looking for the fallback in order to assign |min_retry_delay| if the
4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // primary proxy has a shorter delay.
4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!fallback_allowed_ || !fallback.is_valid() || min_retry_delay) {
4621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    found = retry_map.find(
4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        net::ProxyServer(primary.SchemeIs(url::kHttpsScheme) ?
4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            net::ProxyServer::SCHEME_HTTPS :
4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            net::ProxyServer::SCHEME_HTTP,
4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        net::HostPortPair::FromURL(primary)).ToURI());
4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (found != retry_map.end() && min_retry_delay) {
4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *min_retry_delay = found->second.current_delay;
4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
4705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
4715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (fallback_allowed_ && fallback.is_valid()) {
4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // If fallback is allowed, only the fallback proxy needs to be on the retry
4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // map to know if there was a bypass. We can reset found and forget if the
4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // primary was on the retry map.
4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    found = retry_map.find(
4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        net::ProxyServer(fallback.SchemeIs(url::kHttpsScheme) ?
4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             net::ProxyServer::SCHEME_HTTPS :
4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             net::ProxyServer::SCHEME_HTTP,
4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         net::HostPortPair::FromURL(fallback)).ToURI());
4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (found != retry_map.end() &&
4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        min_retry_delay &&
4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *min_retry_delay > found->second.current_delay) {
4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *min_retry_delay = found->second.current_delay;
4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
4875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return found != retry_map.end();
4895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// TODO(kundaji): Remove tests for macro definitions.
49246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)std::string DataReductionProxyParams::GetDefaultOrigin() const {
4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return kDefaultOrigin;
49446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
49546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
49646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)std::string DataReductionProxyParams::GetDefaultFallbackOrigin() const {
4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return kDefaultFallbackOrigin;
49846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
49946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
50046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)std::string DataReductionProxyParams::GetDefaultSSLOrigin() const {
5011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return kDefaultSslOrigin;
50246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
50346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
50446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)std::string DataReductionProxyParams::GetDefaultAltOrigin() const {
5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return kDefaultAltOrigin;
50646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
50746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
50846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)std::string DataReductionProxyParams::GetDefaultAltFallbackOrigin() const {
5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return kDefaultAltFallbackOrigin;
51046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
51146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
51246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)std::string DataReductionProxyParams::GetDefaultProbeURL() const {
5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return kDefaultProbeUrl;
51446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
51546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)std::string DataReductionProxyParams::GetDefaultWarmupURL() const {
5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return kDefaultWarmupUrl;
5186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
5196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
52046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace data_reduction_proxy
521