Chromium Code Reviews| Index: components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client.cc |
| diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client.cc |
| index 39a9481bc782694f431a6400fc82c34519b5d0f1..7e1c5a36e8c7c275571b14816a7c5626058ef1be 100644 |
| --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client.cc |
| +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client.cc |
| @@ -4,27 +4,170 @@ |
| #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client.h" |
| +#include <string> |
| +#include <vector> |
| + |
| +#include "base/bind.h" |
| +#include "base/bind_helpers.h" |
| #include "base/json/json_writer.h" |
| +#include "base/location.h" |
| #include "base/logging.h" |
| +#include "base/single_thread_task_runner.h" |
| +#include "base/time/time.h" |
| #include "base/values.h" |
| +#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_config.h" |
| +#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_mutable_config_values.h" |
| #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_request_options.h" |
| +#include "components/data_reduction_proxy/core/common/data_reduction_proxy_client_config_parser.h" |
| #include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h" |
| +#include "components/data_reduction_proxy/proto/client_config.pb.h" |
| +#include "net/base/host_port_pair.h" |
| +#include "net/proxy/proxy_server.h" |
| namespace data_reduction_proxy { |
| +namespace { |
| + |
| +// This is the default backoff policy used to communicate with the Data |
| +// Reduction Proxy configuration service. |
| +const net::BackoffEntry::Policy kDefaultBackoffPolicy = { |
| + 0, // num_errors_to_ignore |
| + 1 * 1000, // initial_delay_ms |
| + 4, // multiply_factor |
| + 0.10, // jitter_factor, |
| + 30 * 60 * 1000, // maximum_backoff_ms |
| + -1, // entry_lifetime_ms |
| + true, // always_use_initial_delay |
| +}; |
| + |
| +// Extracts the list of Data Reduction Proxy servers to use for HTTP requests. |
| +std::vector<net::ProxyServer> GetProxiesForHTTP( |
| + const data_reduction_proxy::ProxyConfig& proxy_config) { |
| + std::vector<net::ProxyServer> proxies; |
| + for (const auto& server : proxy_config.http_proxy_servers()) { |
| + if (server.scheme() != ProxyServer_ProxyScheme_UNSPECIFIED) { |
| + proxies.push_back(net::ProxyServer( |
| + config_parser::SchemeFromProxyScheme(server.scheme()), |
| + net::HostPortPair(server.host(), server.port()))); |
| + } |
| + } |
| + |
| + return proxies; |
| +} |
| + |
| +// Calculate the next time at which the Data Reduction Proxy configuration |
| +// should be retrieved, based on response success, configuration expiration, |
| +// and the backoff delay. |
| +base::TimeDelta CalculateNextConfigRefreshTime( |
| + bool fetch_succeeded, |
| + const base::Time& config_expiration, |
| + const base::Time& now, |
| + const base::TimeDelta& backoff_delay) { |
| + if (fetch_succeeded) { |
| + base::TimeDelta success_delay = config_expiration - now; |
|
bengr
2015/03/25 17:15:11
It would probably be a good idea to enforce assump
jeremyim
2015/03/25 17:54:18
Done.
|
| + if (success_delay > backoff_delay) |
| + return success_delay; |
| + } |
| + |
| + return backoff_delay; |
| +} |
| + |
| +} // namespace |
| + |
| +const net::BackoffEntry::Policy& GetBackoffPolicy() { |
| + return kDefaultBackoffPolicy; |
| +} |
| + |
| DataReductionProxyConfigServiceClient::DataReductionProxyConfigServiceClient( |
| - DataReductionProxyParams* params, |
| - DataReductionProxyRequestOptions* request_options) |
| - : params_(params), |
| - request_options_(request_options) { |
| - DCHECK(params); |
| + scoped_ptr<DataReductionProxyParams> params, |
| + const net::BackoffEntry::Policy& backoff_policy, |
| + DataReductionProxyRequestOptions* request_options, |
| + DataReductionProxyMutableConfigValues* config_values, |
| + DataReductionProxyConfig* config, |
| + scoped_refptr<base::SingleThreadTaskRunner> io_task_runner) |
| + : params_(params.Pass()), |
| + request_options_(request_options), |
| + config_values_(config_values), |
| + config_(config), |
| + io_task_runner_(io_task_runner), |
| + backoff_entry_(&backoff_policy) { |
| DCHECK(request_options); |
| + DCHECK(config_values); |
| + DCHECK(config); |
| + DCHECK(io_task_runner.get()); |
| + io_task_runner_->PostTask( |
| + FROM_HERE, |
| + base::Bind(&DataReductionProxyConfigServiceClient::RetrieveConfig, |
| + base::Unretained(this))); |
| } |
| DataReductionProxyConfigServiceClient:: |
| ~DataReductionProxyConfigServiceClient() { |
| } |
| +void DataReductionProxyConfigServiceClient::RetrieveConfig() { |
| + DCHECK(io_task_runner_->BelongsToCurrentThread()); |
| + |
| + std::string static_response = ConstructStaticResponse(); |
| + ClientConfig config; |
| + bool succeeded = false; |
| + if (config_parser::ParseClientConfig(static_response, &config)) { |
| + if (config.has_proxy_config()) { |
| + net::ProxyServer origin; |
| + net::ProxyServer fallback_origin; |
| + std::vector<net::ProxyServer> proxies = |
| + GetProxiesForHTTP(config.proxy_config()); |
| + if (proxies.size() > 0) { |
| + origin = proxies[0]; |
| + if (proxies.size() > 1) |
| + fallback_origin = proxies[1]; |
| + |
| + std::string session; |
| + std::string credentials; |
| + if (DataReductionProxyRequestOptions::ParseLocalSessionKey( |
| + config.session_key(), &session, &credentials)) { |
| + request_options_->SetCredentials(session, credentials); |
| + config_values_->UpdateValues(origin, fallback_origin); |
| + config_->ReloadConfig(); |
| + succeeded = true; |
| + } |
| + } |
| + } |
| + } |
| + |
| + base::Time expiration_time; |
| + if (succeeded) { |
| + expiration_time = config_parser::TimestampToTime(config.expire_time()); |
| + } |
| + |
| + GetBackoffEntry()->InformOfRequest(succeeded); |
| + base::TimeDelta next_config_refresh_time = |
| + CalculateNextConfigRefreshTime(succeeded, expiration_time, Now(), |
| + GetBackoffEntry()->GetTimeUntilRelease()); |
| + SetConfigRefreshTimer(next_config_refresh_time); |
| +} |
| + |
| +const net::BackoffEntry* |
| +DataReductionProxyConfigServiceClient::GetBackoffEntry() const { |
| + return &backoff_entry_; |
| +} |
| + |
| +net::BackoffEntry* DataReductionProxyConfigServiceClient::GetBackoffEntry() { |
| + return &backoff_entry_; |
| +} |
| + |
| +void DataReductionProxyConfigServiceClient::SetConfigRefreshTimer( |
| + const base::TimeDelta& delay) { |
| + config_refresh_timer_.Stop(); |
| + config_refresh_timer_.Start( |
| + FROM_HERE, delay, this, |
| + &DataReductionProxyConfigServiceClient::RetrieveConfig); |
| +} |
| + |
| +base::Time DataReductionProxyConfigServiceClient::Now() const { |
| + return base::Time::Now(); |
| +} |
| + |
| std::string |
| DataReductionProxyConfigServiceClient::ConstructStaticResponse() const { |
| std::string response; |