| Index: components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.cc
|
| diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.cc
|
| index 88aa3176d0f6ae6ec6f3c7122300840a353426b4..5b21f4a4c3c9aa6f3e3ea56833a37c1798ae53e8 100644
|
| --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.cc
|
| +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.cc
|
| @@ -6,66 +6,25 @@
|
|
|
| #include "base/bind.h"
|
| #include "base/command_line.h"
|
| -#include "base/metrics/field_trial.h"
|
| #include "base/metrics/histogram.h"
|
| -#include "base/metrics/sparse_histogram.h"
|
| #include "base/prefs/pref_member.h"
|
| #include "base/prefs/pref_service.h"
|
| -#include "base/prefs/scoped_user_pref_update.h"
|
| #include "base/strings/string_number_conversions.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "base/strings/stringprintf.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| #include "base/values.h"
|
| -#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_auth_request_handler.h"
|
| -#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_configurator.h"
|
| +#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_config.h"
|
| +#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.h"
|
| +#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_statistics_prefs.h"
|
| #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_usage_stats.h"
|
| #include "components/data_reduction_proxy/core/common/data_reduction_proxy_event_store.h"
|
| #include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
|
| #include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h"
|
| #include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
|
| -#include "net/base/host_port_pair.h"
|
| -#include "net/base/load_flags.h"
|
| -#include "net/base/net_errors.h"
|
| -#include "net/base/net_util.h"
|
| -#include "net/http/http_network_session.h"
|
| -#include "net/http/http_response_headers.h"
|
| -#include "net/url_request/url_fetcher.h"
|
| -#include "net/url_request/url_fetcher_delegate.h"
|
| -#include "net/url_request/url_request_context_getter.h"
|
| -#include "net/url_request/url_request_status.h"
|
| -#include "url/gurl.h"
|
| -
|
| -
|
| -using base::StringPrintf;
|
|
|
| namespace {
|
| -// Values of the UMA DataReductionProxy.NetworkChangeEvents histograms.
|
| -// This enum must remain synchronized with the enum of the same
|
| -// name in metrics/histograms/histograms.xml.
|
| -enum DataReductionProxyNetworkChangeEvent {
|
| - IP_CHANGED = 0, // The client IP address changed.
|
| - DISABLED_ON_VPN = 1, // The proxy is disabled because a VPN is running.
|
| - CHANGE_EVENT_COUNT = 2 // This must always be last.
|
| -};
|
| -
|
| // Key of the UMA DataReductionProxy.StartupState histogram.
|
| const char kUMAProxyStartupStateHistogram[] =
|
| "DataReductionProxy.StartupState";
|
|
|
| -// Key of the UMA DataReductionProxy.ProbeURL histogram.
|
| -const char kUMAProxyProbeURL[] = "DataReductionProxy.ProbeURL";
|
| -
|
| -// Key of the UMA DataReductionProxy.ProbeURLNetError histogram.
|
| -const char kUMAProxyProbeURLNetError[] = "DataReductionProxy.ProbeURLNetError";
|
| -
|
| -// Record a network change event.
|
| -void RecordNetworkChangeEvent(DataReductionProxyNetworkChangeEvent event) {
|
| - UMA_HISTOGRAM_ENUMERATION("DataReductionProxy.NetworkChangeEvents",
|
| - event,
|
| - CHANGE_EVENT_COUNT);
|
| -}
|
| -
|
| int64 GetInt64PrefValue(const base::ListValue& list_value, size_t index) {
|
| int64 val = 0;
|
| std::string pref_value;
|
| @@ -89,25 +48,19 @@ bool IsEnabledOnCommandLine() {
|
|
|
| namespace data_reduction_proxy {
|
|
|
| -DataReductionProxySettings::DataReductionProxySettings(
|
| - scoped_ptr<DataReductionProxyParams> params)
|
| - : restricted_by_carrier_(false),
|
| - enabled_by_user_(false),
|
| - disabled_on_vpn_(false),
|
| - unreachable_(false),
|
| +DataReductionProxySettings::DataReductionProxySettings()
|
| + : unreachable_(false),
|
| + allowed_(false),
|
| + alternative_allowed_(false),
|
| + promo_allowed_(false),
|
| prefs_(NULL),
|
| - url_request_context_getter_(NULL),
|
| - net_log_(NULL),
|
| event_store_(NULL),
|
| - configurator_(NULL) {
|
| - DCHECK(params.get());
|
| - config_.reset(new DataReductionProxyConfig(params.Pass()));
|
| + config_(nullptr) {
|
| }
|
|
|
| DataReductionProxySettings::~DataReductionProxySettings() {
|
| - if (params()->allowed())
|
| + if (allowed_)
|
| spdy_proxy_auth_enabled_.Destroy();
|
| - net::NetworkChangeNotifier::RemoveIPAddressObserver(this);
|
| }
|
|
|
| void DataReductionProxySettings::InitPrefMembers() {
|
| @@ -125,28 +78,28 @@ void DataReductionProxySettings::InitPrefMembers() {
|
| base::Unretained(this)));
|
| }
|
|
|
| +void DataReductionProxySettings::UpdateConfigValues() {
|
| + DCHECK(config_);
|
| + allowed_ = config_->params()->allowed();
|
| + alternative_allowed_ = config_->params()->alternative_allowed();
|
| + promo_allowed_ = config_->params()->promo_allowed();
|
| + primary_origin_ = config_->params()->origin();
|
| +}
|
| +
|
| void DataReductionProxySettings::InitDataReductionProxySettings(
|
| PrefService* prefs,
|
| - net::URLRequestContextGetter* url_request_context_getter,
|
| - net::NetLog* net_log,
|
| - DataReductionProxyEventStore* event_store) {
|
| + DataReductionProxyIOData* io_data) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| DCHECK(prefs);
|
| - DCHECK(url_request_context_getter);
|
| - DCHECK(event_store);
|
| + DCHECK(io_data);
|
| + DCHECK(io_data->config());
|
| + DCHECK(io_data->event_store());
|
| prefs_ = prefs;
|
| - url_request_context_getter_ = url_request_context_getter;
|
| - net_log_ = net_log;
|
| - event_store_ = event_store;
|
| + config_ = io_data->config();
|
| + event_store_ = io_data->event_store();
|
| InitPrefMembers();
|
| + UpdateConfigValues();
|
| RecordDataReductionInit();
|
| -
|
| - // Disable the proxy if it is not allowed to be used.
|
| - if (!params()->allowed())
|
| - return;
|
| -
|
| - AddDefaultProxyBypassRules();
|
| - net::NetworkChangeNotifier::AddIPAddressObserver(this);
|
| }
|
|
|
| void DataReductionProxySettings::SetDataReductionProxyStatisticsPrefs(
|
| @@ -160,12 +113,6 @@ void DataReductionProxySettings::SetOnDataReductionEnabledCallback(
|
| on_data_reduction_proxy_enabled_.Run(IsDataReductionProxyEnabled());
|
| }
|
|
|
| -void DataReductionProxySettings::SetProxyConfigurator(
|
| - DataReductionProxyConfigurator* configurator) {
|
| - DCHECK(configurator);
|
| - configurator_ = configurator;
|
| -}
|
| -
|
| bool DataReductionProxySettings::IsDataReductionProxyEnabled() {
|
| return spdy_proxy_auth_enabled_.GetValue() || IsEnabledOnCommandLine();
|
| }
|
| @@ -182,7 +129,7 @@ bool DataReductionProxySettings::IsDataReductionProxyManaged() {
|
| void DataReductionProxySettings::SetDataReductionProxyEnabled(bool enabled) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| // Prevent configuring the proxy when it is not allowed to be used.
|
| - if (!params()->allowed())
|
| + if (!allowed_)
|
| return;
|
|
|
| if (spdy_proxy_auth_enabled_.GetValue() != enabled) {
|
| @@ -195,7 +142,7 @@ void DataReductionProxySettings::SetDataReductionProxyAlternativeEnabled(
|
| bool enabled) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| // Prevent configuring the proxy when it is not allowed to be used.
|
| - if (!params()->alternative_allowed())
|
| + if (!alternative_allowed_)
|
| return;
|
| if (data_reduction_proxy_alternative_enabled_.GetValue() != enabled) {
|
| data_reduction_proxy_alternative_enabled_.SetValue(enabled);
|
| @@ -233,146 +180,23 @@ DataReductionProxySettings::GetDailyReceivedContentLengths() {
|
| return GetDailyContentLengths(prefs::kDailyHttpReceivedContentLength);
|
| }
|
|
|
| -void DataReductionProxySettings::OnURLFetchComplete(
|
| - const net::URLFetcher* source) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - DCHECK(source == fetcher_.get());
|
| - net::URLRequestStatus status = source->GetStatus();
|
| -
|
| - if (event_store_) {
|
| - event_store_->EndCanaryRequest(bound_net_log_, status.error());
|
| - }
|
| -
|
| - if (status.status() == net::URLRequestStatus::FAILED) {
|
| - if (status.error() == net::ERR_INTERNET_DISCONNECTED) {
|
| - RecordProbeURLFetchResult(INTERNET_DISCONNECTED);
|
| - return;
|
| - }
|
| - // TODO(bengr): Remove once we understand the reasons probes are failing.
|
| - // Probe errors are either due to fetcher-level errors or modified
|
| - // responses. This only tracks the former.
|
| - UMA_HISTOGRAM_SPARSE_SLOWLY(
|
| - kUMAProxyProbeURLNetError, std::abs(status.error()));
|
| - }
|
| -
|
| - std::string response;
|
| - source->GetResponseAsString(&response);
|
| -
|
| - if ("OK" == response.substr(0, 2)) {
|
| - DVLOG(1) << "The data reduction proxy is unrestricted.";
|
| -
|
| - if (enabled_by_user_) {
|
| - if (restricted_by_carrier_) {
|
| - // The user enabled the proxy, but sometime previously in the session,
|
| - // the network operator had blocked the canary and restricted the user.
|
| - // The current network doesn't block the canary, so don't restrict the
|
| - // proxy configurations.
|
| - SetProxyConfigs(true /* enabled */,
|
| - IsDataReductionProxyAlternativeEnabled(),
|
| - false /* restricted */,
|
| - false /* at_startup */);
|
| - RecordProbeURLFetchResult(SUCCEEDED_PROXY_ENABLED);
|
| - } else {
|
| - RecordProbeURLFetchResult(SUCCEEDED_PROXY_ALREADY_ENABLED);
|
| - }
|
| - }
|
| - restricted_by_carrier_ = false;
|
| - return;
|
| - }
|
| - DVLOG(1) << "The data reduction proxy is restricted to the configured "
|
| - << "fallback proxy.";
|
| - if (enabled_by_user_) {
|
| - if (!restricted_by_carrier_) {
|
| - // Restrict the proxy.
|
| - SetProxyConfigs(true /* enabled */,
|
| - IsDataReductionProxyAlternativeEnabled(),
|
| - true /* restricted */,
|
| - false /* at_startup */);
|
| - RecordProbeURLFetchResult(FAILED_PROXY_DISABLED);
|
| - } else {
|
| - RecordProbeURLFetchResult(FAILED_PROXY_ALREADY_DISABLED);
|
| - }
|
| - }
|
| - restricted_by_carrier_ = true;
|
| -}
|
| -
|
| PrefService* DataReductionProxySettings::GetOriginalProfilePrefs() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| return prefs_;
|
| }
|
|
|
| -void DataReductionProxySettings::AddDefaultProxyBypassRules() {
|
| - // localhost
|
| - DCHECK(configurator_);
|
| - configurator_->AddHostPatternToBypass("<local>");
|
| - // RFC6890 loopback addresses.
|
| - // TODO(tbansal): Remove this once crbug/446705 is fixed.
|
| - configurator_->AddHostPatternToBypass("127.0.0.0/8");
|
| -
|
| - // RFC6890 current network (only valid as source address).
|
| - configurator_->AddHostPatternToBypass("0.0.0.0/8");
|
| -
|
| - // RFC1918 private addresses.
|
| - configurator_->AddHostPatternToBypass("10.0.0.0/8");
|
| - configurator_->AddHostPatternToBypass("172.16.0.0/12");
|
| - configurator_->AddHostPatternToBypass("192.168.0.0/16");
|
| -
|
| - // RFC3513 unspecified address.
|
| - configurator_->AddHostPatternToBypass("::/128");
|
| -
|
| - // RFC4193 private addresses.
|
| - configurator_->AddHostPatternToBypass("fc00::/7");
|
| - // IPV6 probe addresses.
|
| - configurator_->AddHostPatternToBypass("*-ds.metric.gstatic.com");
|
| - configurator_->AddHostPatternToBypass("*-v4.metric.gstatic.com");
|
| -}
|
| -
|
| -void DataReductionProxySettings::LogProxyState(
|
| - bool enabled, bool restricted, bool at_startup) {
|
| - // This must stay a LOG(WARNING); the output is used in processing customer
|
| - // feedback.
|
| - const char kAtStartup[] = "at startup";
|
| - const char kByUser[] = "by user action";
|
| - const char kOn[] = "ON";
|
| - const char kOff[] = "OFF";
|
| - const char kRestricted[] = "(Restricted)";
|
| - const char kUnrestricted[] = "(Unrestricted)";
|
| -
|
| - std::string annotated_on =
|
| - kOn + std::string(" ") + (restricted ? kRestricted : kUnrestricted);
|
| -
|
| - LOG(WARNING) << "SPDY proxy " << (enabled ? annotated_on : kOff)
|
| - << " " << (at_startup ? kAtStartup : kByUser);
|
| -}
|
| -
|
| -void DataReductionProxySettings::OnIPAddressChanged() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - if (enabled_by_user_) {
|
| - DCHECK(params()->allowed());
|
| - RecordNetworkChangeEvent(IP_CHANGED);
|
| - if (DisableIfVPN())
|
| - return;
|
| - if (IsDataReductionProxyAlternativeEnabled() &&
|
| - !params()->alternative_fallback_allowed()) {
|
| - return;
|
| - }
|
| - ProbeWhetherDataReductionProxyIsAvailable();
|
| - }
|
| -}
|
| -
|
| void DataReductionProxySettings::OnProxyEnabledPrefChange() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| if (!on_data_reduction_proxy_enabled_.is_null())
|
| on_data_reduction_proxy_enabled_.Run(IsDataReductionProxyEnabled());
|
| - if (!params()->allowed())
|
| + if (!allowed_)
|
| return;
|
| MaybeActivateDataReductionProxy(false);
|
| }
|
|
|
| void DataReductionProxySettings::OnProxyAlternativeEnabledPrefChange() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| - if (!params()->alternative_allowed())
|
| + if (!alternative_allowed_)
|
| return;
|
| MaybeActivateDataReductionProxy(false);
|
| }
|
| @@ -409,54 +233,15 @@ void DataReductionProxySettings::MaybeActivateDataReductionProxy(
|
| ResetDataReductionStatistics();
|
| }
|
| // Configure use of the data reduction proxy if it is enabled.
|
| - enabled_by_user_= IsDataReductionProxyEnabled();
|
| - SetProxyConfigs(enabled_by_user_ && !disabled_on_vpn_,
|
| - IsDataReductionProxyAlternativeEnabled(),
|
| - restricted_by_carrier_,
|
| - at_startup);
|
| -
|
| - // Check if the proxy has been restricted explicitly by the carrier.
|
| - if (enabled_by_user_ && !disabled_on_vpn_ &&
|
| - !(IsDataReductionProxyAlternativeEnabled() &&
|
| - !params()->alternative_fallback_allowed())) {
|
| - ProbeWhetherDataReductionProxyIsAvailable();
|
| - }
|
| -}
|
| -
|
| -void DataReductionProxySettings::SetProxyConfigs(bool enabled,
|
| - bool alternative_enabled,
|
| - bool restricted,
|
| - bool at_startup) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(configurator_);
|
| -
|
| - LogProxyState(enabled, restricted, at_startup);
|
| - // The alternative is only configured if the standard configuration is
|
| - // is enabled.
|
| - if (enabled & !params()->holdback()) {
|
| - if (alternative_enabled) {
|
| - configurator_->Enable(restricted,
|
| - !params()->alternative_fallback_allowed(),
|
| - params()->alt_origin().spec(),
|
| - std::string(),
|
| - params()->ssl_origin().spec());
|
| - } else {
|
| - configurator_->Enable(restricted,
|
| - !params()->fallback_allowed(),
|
| - params()->origin().spec(),
|
| - params()->fallback_origin().spec(),
|
| - std::string());
|
| - }
|
| - } else {
|
| - configurator_->Disable();
|
| - }
|
| + config_->SetProxyPrefs(IsDataReductionProxyEnabled(),
|
| + IsDataReductionProxyAlternativeEnabled(), at_startup);
|
| }
|
|
|
| // Metrics methods
|
| void DataReductionProxySettings::RecordDataReductionInit() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| ProxyStartupState state = PROXY_NOT_AVAILABLE;
|
| - if (params()->allowed()) {
|
| + if (allowed_) {
|
| if (IsDataReductionProxyEnabled())
|
| state = PROXY_ENABLED;
|
| else
|
| @@ -466,25 +251,12 @@ void DataReductionProxySettings::RecordDataReductionInit() {
|
| RecordStartupState(state);
|
| }
|
|
|
| -void DataReductionProxySettings::RecordProbeURLFetchResult(
|
| - ProbeURLFetchResult result) {
|
| - UMA_HISTOGRAM_ENUMERATION(kUMAProxyProbeURL,
|
| - result,
|
| - PROBE_URL_FETCH_RESULT_COUNT);
|
| -}
|
| -
|
| void DataReductionProxySettings::RecordStartupState(ProxyStartupState state) {
|
| UMA_HISTOGRAM_ENUMERATION(kUMAProxyStartupStateHistogram,
|
| state,
|
| PROXY_STARTUP_STATE_COUNT);
|
| }
|
|
|
| -void DataReductionProxySettings::GetNetworkList(
|
| - net::NetworkInterfaceList* interfaces,
|
| - int policy) {
|
| - net::GetNetworkList(interfaces, policy);
|
| -}
|
| -
|
| DataReductionProxySettings::ContentLengthList
|
| DataReductionProxySettings::GetDailyContentLengths(const char* pref_name) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| @@ -535,77 +307,4 @@ void DataReductionProxySettings::GetContentLengths(
|
| statistics_prefs_->GetInt64(prefs::kDailyHttpContentLengthLastUpdateDate);
|
| }
|
|
|
| -net::URLFetcher* DataReductionProxySettings::GetBaseURLFetcher(
|
| - const GURL& gurl,
|
| - int load_flags) {
|
| -
|
| - net::URLFetcher* fetcher = net::URLFetcher::Create(gurl,
|
| - net::URLFetcher::GET,
|
| - this);
|
| - fetcher->SetLoadFlags(load_flags);
|
| - DCHECK(url_request_context_getter_);
|
| - fetcher->SetRequestContext(url_request_context_getter_);
|
| - // Configure max retries to be at most kMaxRetries times for 5xx errors.
|
| - static const int kMaxRetries = 5;
|
| - fetcher->SetMaxRetriesOn5xx(kMaxRetries);
|
| - fetcher->SetAutomaticallyRetryOnNetworkChanges(kMaxRetries);
|
| - return fetcher;
|
| -}
|
| -
|
| -
|
| -net::URLFetcher*
|
| -DataReductionProxySettings::GetURLFetcherForAvailabilityCheck() {
|
| - return GetBaseURLFetcher(params()->probe_url(),
|
| - net::LOAD_DISABLE_CACHE | net::LOAD_BYPASS_PROXY);
|
| -}
|
| -
|
| -
|
| -void DataReductionProxySettings::ProbeWhetherDataReductionProxyIsAvailable() {
|
| - net::URLFetcher* fetcher = GetURLFetcherForAvailabilityCheck();
|
| - if (!fetcher)
|
| - return;
|
| - fetcher_.reset(fetcher);
|
| -
|
| - bound_net_log_ = net::BoundNetLog::Make(
|
| - net_log_, net::NetLog::SOURCE_DATA_REDUCTION_PROXY);
|
| - if (event_store_) {
|
| - event_store_->BeginCanaryRequest(bound_net_log_,
|
| - fetcher_->GetOriginalURL());
|
| - }
|
| -
|
| - fetcher_->Start();
|
| -}
|
| -
|
| -bool DataReductionProxySettings::DisableIfVPN() {
|
| - net::NetworkInterfaceList network_interfaces;
|
| - GetNetworkList(&network_interfaces, 0);
|
| - // VPNs use a "tun" interface, so the presence of a "tun" interface indicates
|
| - // a VPN is in use.
|
| - // TODO(kundaji): Verify this works on Windows.
|
| - const std::string vpn_interface_name_prefix = "tun";
|
| - for (size_t i = 0; i < network_interfaces.size(); ++i) {
|
| - std::string interface_name = network_interfaces[i].name;
|
| - if (LowerCaseEqualsASCII(
|
| - interface_name.begin(),
|
| - interface_name.begin() + vpn_interface_name_prefix.size(),
|
| - vpn_interface_name_prefix.c_str())) {
|
| - SetProxyConfigs(false,
|
| - IsDataReductionProxyAlternativeEnabled(),
|
| - false,
|
| - false);
|
| - disabled_on_vpn_ = true;
|
| - RecordNetworkChangeEvent(DISABLED_ON_VPN);
|
| - return true;
|
| - }
|
| - }
|
| - if (disabled_on_vpn_) {
|
| - SetProxyConfigs(enabled_by_user_,
|
| - IsDataReductionProxyAlternativeEnabled(),
|
| - restricted_by_carrier_,
|
| - false);
|
| - }
|
| - disabled_on_vpn_ = false;
|
| - return false;
|
| -}
|
| -
|
| } // namespace data_reduction_proxy
|
|
|