| Index: components/data_reduction_proxy/core/browser/data_reduction_proxy_config.cc
|
| diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config.cc
|
| index 573a235e2e0e2a5c6f32070690a2dee0799a3168..2328d26525eb70659da8f1a52a4fc325d1a77c58 100644
|
| --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config.cc
|
| +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config.cc
|
| @@ -11,6 +11,7 @@
|
| #include "base/single_thread_task_runner.h"
|
| #include "base/strings/string_util.h"
|
| #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_configurator.h"
|
| +#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.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 "net/base/load_flags.h"
|
| @@ -47,47 +48,71 @@ void RecordNetworkChangeEvent(DataReductionProxyNetworkChangeEvent event) {
|
| namespace data_reduction_proxy {
|
|
|
| DataReductionProxyConfig::DataReductionProxyConfig(
|
| - scoped_ptr<DataReductionProxyParams> params)
|
| + scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
|
| + scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
|
| + net::NetLog* net_log,
|
| + scoped_ptr<DataReductionProxyParams> params,
|
| + DataReductionProxyConfigurator* configurator,
|
| + DataReductionProxyEventStore* event_store)
|
| : restricted_by_carrier_(false),
|
| disabled_on_vpn_(false),
|
| unreachable_(false),
|
| enabled_by_user_(false),
|
| alternative_enabled_by_user_(false),
|
| - net_log_(nullptr),
|
| - url_request_context_getter_(nullptr),
|
| - configurator_(nullptr),
|
| - event_store_(nullptr) {
|
| - params_.reset(params.release());
|
| + params_(params.release()),
|
| + io_task_runner_(io_task_runner),
|
| + ui_task_runner_(ui_task_runner),
|
| + net_log_(net_log),
|
| + configurator_(configurator),
|
| + event_store_(event_store) {
|
| + DCHECK(io_task_runner);
|
| + DCHECK(ui_task_runner);
|
| + DCHECK(configurator);
|
| + DCHECK(event_store);
|
| + InitOnIOThread();
|
| }
|
|
|
| DataReductionProxyConfig::~DataReductionProxyConfig() {
|
| net::NetworkChangeNotifier::RemoveIPAddressObserver(this);
|
| }
|
|
|
| -void DataReductionProxyConfig::InitDataReductionProxyConfig(
|
| - scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
|
| - net::NetLog* net_log,
|
| - net::URLRequestContextGetter* url_request_context_getter,
|
| - DataReductionProxyConfigurator* configurator,
|
| - DataReductionProxyEventStore* event_store) {
|
| - DCHECK(io_task_runner);
|
| - DCHECK(configurator);
|
| - DCHECK(event_store);
|
| - DCHECK(io_task_runner->BelongsToCurrentThread());
|
| - io_task_runner_ = io_task_runner;
|
| - net_log_ = net_log;
|
| - url_request_context_getter_ = url_request_context_getter;
|
| - configurator_ = configurator;
|
| - event_store_ = event_store;
|
| - net::NetworkChangeNotifier::AddIPAddressObserver(this);
|
| +void DataReductionProxyConfig::SetDataReductionProxyService(
|
| + base::WeakPtr<DataReductionProxyService> data_reduction_proxy_service) {
|
| + data_reduction_proxy_service_ = data_reduction_proxy_service;
|
| }
|
|
|
| -void DataReductionProxyConfig::SetProxyConfigs(bool enabled,
|
| - bool alternative_enabled,
|
| - bool restricted,
|
| - bool at_startup) {
|
| - DCHECK(configurator_);
|
| +void DataReductionProxyConfig::SetProxyPrefs(bool enabled,
|
| + bool alternative_enabled,
|
| + bool at_startup) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + io_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&DataReductionProxyConfig::SetProxyConfigOnIOThread,
|
| + base::Unretained(this), enabled,
|
| + alternative_enabled, at_startup));
|
| +}
|
| +
|
| +void DataReductionProxyConfig::SetProxyConfigOnIOThread(
|
| + bool enabled, bool alternative_enabled, bool at_startup) {
|
| + enabled_by_user_ = enabled;
|
| + alternative_enabled_by_user_ = alternative_enabled;
|
| + UpdateConfigurator(enabled_by_user_, alternative_enabled_by_user_,
|
| + restricted_by_carrier_, at_startup);
|
| +
|
| + // Check if the proxy has been restricted explicitly by the carrier.
|
| + if (enabled &&
|
| + !(alternative_enabled && !params()->alternative_fallback_allowed())) {
|
| + ui_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&DataReductionProxyConfig::StartProbe,
|
| + base::Unretained(this)));
|
| + }
|
| +}
|
|
|
| +void DataReductionProxyConfig::UpdateConfigurator(bool enabled,
|
| + bool alternative_enabled,
|
| + bool restricted,
|
| + bool at_startup) {
|
| + DCHECK(io_task_runner_->BelongsToCurrentThread());
|
| + DCHECK(configurator_);
|
| LogProxyState(enabled, restricted, at_startup);
|
| // The alternative is only configured if the standard configuration is
|
| // is enabled.
|
| @@ -126,11 +151,17 @@ void DataReductionProxyConfig::LogProxyState(bool enabled,
|
| << (at_startup ? kAtStartup : kByUser);
|
| }
|
|
|
| -void DataReductionProxyConfig::OnURLFetchComplete(
|
| - const net::URLFetcher* source) {
|
| - DCHECK(source == fetcher_.get());
|
| - net::URLRequestStatus status = source->GetStatus();
|
| +void DataReductionProxyConfig::HandleProbeResponse(
|
| + const std::string& response, const net::URLRequestStatus& status) {
|
| + DCHECK(ui_task_runner_->BelongsToCurrentThread());
|
| + io_task_runner_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&DataReductionProxyConfig::HandleProbeResponseOnIOThread,
|
| + base::Unretained(this), response, status));
|
| +}
|
|
|
| +void DataReductionProxyConfig::HandleProbeResponseOnIOThread(
|
| + const std::string& response, const net::URLRequestStatus& status) {
|
| if (event_store_) {
|
| event_store_->EndCanaryRequest(bound_net_log_, status.error());
|
| }
|
| @@ -147,9 +178,6 @@ void DataReductionProxyConfig::OnURLFetchComplete(
|
| std::abs(status.error()));
|
| }
|
|
|
| - std::string response;
|
| - source->GetResponseAsString(&response);
|
| -
|
| if ("OK" == response.substr(0, 2)) {
|
| DVLOG(1) << "The data reduction proxy is unrestricted.";
|
|
|
| @@ -159,8 +187,8 @@ void DataReductionProxyConfig::OnURLFetchComplete(
|
| // 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 */, false /* alternative_enabled */,
|
| - false /* restricted */, false /* at_startup */);
|
| + UpdateConfigurator(true /* enabled */, false /* alternative_enabled */,
|
| + false /* restricted */, false /* at_startup */);
|
| RecordProbeURLFetchResult(SUCCEEDED_PROXY_ENABLED);
|
| } else {
|
| RecordProbeURLFetchResult(SUCCEEDED_PROXY_ALREADY_ENABLED);
|
| @@ -174,8 +202,8 @@ void DataReductionProxyConfig::OnURLFetchComplete(
|
| if (enabled_by_user_) {
|
| if (!restricted_by_carrier_) {
|
| // Restrict the proxy.
|
| - SetProxyConfigs(true /* enabled */, false /* alternative_enabled */,
|
| - true /* restricted */, false /* at_startup */);
|
| + UpdateConfigurator(true /* enabled */, false /* alternative_enabled */,
|
| + true /* restricted */, false /* at_startup */);
|
| RecordProbeURLFetchResult(FAILED_PROXY_DISABLED);
|
| } else {
|
| RecordProbeURLFetchResult(FAILED_PROXY_ALREADY_DISABLED);
|
| @@ -185,6 +213,7 @@ void DataReductionProxyConfig::OnURLFetchComplete(
|
| }
|
|
|
| void DataReductionProxyConfig::OnIPAddressChanged() {
|
| + DCHECK(io_task_runner_->BelongsToCurrentThread());
|
| if (enabled_by_user_) {
|
| DCHECK(params()->allowed());
|
| RecordNetworkChangeEvent(IP_CHANGED);
|
| @@ -194,10 +223,28 @@ void DataReductionProxyConfig::OnIPAddressChanged() {
|
| !params()->alternative_fallback_allowed()) {
|
| return;
|
| }
|
| - ProbeWhetherDataReductionProxyIsAvailable();
|
| +
|
| + ui_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&DataReductionProxyConfig::StartProbe,
|
| + base::Unretained(this)));
|
| }
|
| }
|
|
|
| +void DataReductionProxyConfig::InitOnIOThread() {
|
| + if (!io_task_runner_->BelongsToCurrentThread()) {
|
| + io_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&DataReductionProxyConfig::InitOnIOThread,
|
| + base::Unretained(this)));
|
| + return;
|
| + }
|
| +
|
| + if (!params_->allowed())
|
| + return;
|
| +
|
| + AddDefaultProxyBypassRules();
|
| + net::NetworkChangeNotifier::AddIPAddressObserver(this);
|
| +}
|
| +
|
| void DataReductionProxyConfig::AddDefaultProxyBypassRules() {
|
| // localhost
|
| DCHECK(configurator_);
|
| @@ -230,33 +277,19 @@ void DataReductionProxyConfig::RecordProbeURLFetchResult(
|
| PROBE_URL_FETCH_RESULT_COUNT);
|
| }
|
|
|
| -net::URLFetcher* DataReductionProxyConfig::GetURLFetcherForProbe() {
|
| - net::URLFetcher* fetcher =
|
| - net::URLFetcher::Create(params_->probe_url(), net::URLFetcher::GET, this);
|
| - fetcher->SetLoadFlags(net::LOAD_DISABLE_CACHE | net::LOAD_BYPASS_PROXY);
|
| - 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;
|
| -}
|
| -
|
| -void DataReductionProxyConfig::ProbeWhetherDataReductionProxyIsAvailable() {
|
| - net::URLFetcher* fetcher = GetURLFetcherForProbe();
|
| - if (!fetcher)
|
| - return;
|
| - fetcher_.reset(fetcher);
|
| -
|
| +void DataReductionProxyConfig::StartProbe() {
|
| + DCHECK(ui_task_runner_->BelongsToCurrentThread());
|
| 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());
|
| + if (data_reduction_proxy_service_) {
|
| + if (event_store_)
|
| + event_store_->BeginCanaryRequest(bound_net_log_, params_->probe_url());
|
| +
|
| + data_reduction_proxy_service_->CheckProbeURL(
|
| + params_->probe_url(),
|
| + base::Bind(&DataReductionProxyConfig::HandleProbeResponse,
|
| + base::Unretained(this)));
|
| }
|
| -
|
| - fetcher_->Start();
|
| }
|
|
|
| void DataReductionProxyConfig::GetNetworkList(
|
| @@ -278,15 +311,15 @@ bool DataReductionProxyConfig::DisableIfVPN() {
|
| interface_name.begin(),
|
| interface_name.begin() + vpn_interface_name_prefix.size(),
|
| vpn_interface_name_prefix.c_str())) {
|
| - SetProxyConfigs(false, alternative_enabled_by_user_, false, false);
|
| + UpdateConfigurator(false, alternative_enabled_by_user_, false, false);
|
| disabled_on_vpn_ = true;
|
| RecordNetworkChangeEvent(DISABLED_ON_VPN);
|
| return true;
|
| }
|
| }
|
| if (disabled_on_vpn_) {
|
| - SetProxyConfigs(enabled_by_user_, alternative_enabled_by_user_,
|
| - restricted_by_carrier_, false);
|
| + UpdateConfigurator(enabled_by_user_, alternative_enabled_by_user_,
|
| + restricted_by_carrier_, false);
|
| }
|
| disabled_on_vpn_ = false;
|
| return false;
|
|
|