| Index: components/data_reduction_proxy/core/browser/data_reduction_proxy_usage_stats.cc
|
| diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_usage_stats.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_usage_stats.cc
|
| index d32c618cb1ea7dbdb653bfd68143ec24ab1f9624..7c1293b431570c4b1d4ebe4b7afbfd7008c57c29 100644
|
| --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_usage_stats.cc
|
| +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_usage_stats.cc
|
| @@ -6,10 +6,11 @@
|
|
|
| #include "base/bind.h"
|
| #include "base/callback.h"
|
| -#include "base/message_loop/message_loop_proxy.h"
|
| #include "base/metrics/histogram.h"
|
| #include "base/metrics/sparse_histogram.h"
|
| #include "base/prefs/pref_member.h"
|
| +#include "base/single_thread_task_runner.h"
|
| +#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
|
| #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_tamper_detection.h"
|
| #include "components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h"
|
| #include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
|
| @@ -103,16 +104,18 @@ void DataReductionProxyUsageStats::DetectAndRecordMissingViaHeaderResponseCode(
|
|
|
| DataReductionProxyUsageStats::DataReductionProxyUsageStats(
|
| DataReductionProxyParams* params,
|
| - const scoped_refptr<MessageLoopProxy>& ui_thread_proxy)
|
| + DataReductionProxySettings* settings,
|
| + const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner)
|
| : data_reduction_proxy_params_(params),
|
| + settings_(settings),
|
| last_bypass_type_(BYPASS_EVENT_TYPE_MAX),
|
| triggering_request_(true),
|
| - ui_thread_proxy_(ui_thread_proxy),
|
| + ui_task_runner_(ui_task_runner),
|
| successful_requests_through_proxy_count_(0),
|
| proxy_net_errors_count_(0),
|
| unavailable_(false) {
|
| DCHECK(params);
|
| -
|
| + DCHECK(settings);
|
| NetworkChangeNotifier::AddNetworkChangeObserver(this);
|
| };
|
|
|
| @@ -156,39 +159,6 @@ void DataReductionProxyUsageStats::OnUrlRequestCompleted(
|
| }
|
| }
|
|
|
| -void DataReductionProxyUsageStats::OnNetworkChanged(
|
| - NetworkChangeNotifier::ConnectionType type) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - ClearRequestCounts();
|
| -}
|
| -
|
| -void DataReductionProxyUsageStats::ClearRequestCounts() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - successful_requests_through_proxy_count_ = 0;
|
| - proxy_net_errors_count_ = 0;
|
| -}
|
| -
|
| -void DataReductionProxyUsageStats::NotifyUnavailabilityIfChanged() {
|
| - bool prev_unavailable = unavailable_;
|
| - unavailable_ =
|
| - (proxy_net_errors_count_ >= kMinFailedRequestsWhenUnavailable &&
|
| - successful_requests_through_proxy_count_ <=
|
| - kMaxSuccessfulRequestsWhenUnavailable);
|
| - if (prev_unavailable != unavailable_) {
|
| - ui_thread_proxy_->PostTask(FROM_HERE, base::Bind(
|
| - &DataReductionProxyUsageStats::NotifyUnavailabilityOnUIThread,
|
| - base::Unretained(this),
|
| - unavailable_));
|
| - }
|
| -}
|
| -
|
| -void DataReductionProxyUsageStats::NotifyUnavailabilityOnUIThread(
|
| - bool unavailable) {
|
| - DCHECK(ui_thread_proxy_->BelongsToCurrentThread());
|
| - if (!unavailable_callback_.is_null())
|
| - unavailable_callback_.Run(unavailable);
|
| -}
|
| -
|
| void DataReductionProxyUsageStats::SetBypassType(
|
| DataReductionProxyBypassType type) {
|
| last_bypass_type_ = type;
|
| @@ -209,6 +179,53 @@ void DataReductionProxyUsageStats::RecordBytesHistograms(
|
| RecordMissingViaHeaderBytes(request);
|
| }
|
|
|
| +void DataReductionProxyUsageStats::OnProxyFallback(
|
| + const net::ProxyServer& bypassed_proxy,
|
| + int net_error) {
|
| + DataReductionProxyTypeInfo data_reduction_proxy_info;
|
| + if (bypassed_proxy.is_valid() && !bypassed_proxy.is_direct() &&
|
| + data_reduction_proxy_params_->IsDataReductionProxy(
|
| + bypassed_proxy.host_port_pair(), &data_reduction_proxy_info)) {
|
| + if (data_reduction_proxy_info.is_ssl)
|
| + return;
|
| +
|
| + proxy_net_errors_count_++;
|
| +
|
| + // To account for the case when the proxy is reachable for sometime, and
|
| + // then gets blocked, we reset counts when number of errors exceed
|
| + // the threshold.
|
| + if (proxy_net_errors_count_ >= kMaxFailedRequestsBeforeReset &&
|
| + successful_requests_through_proxy_count_ >
|
| + kMaxSuccessfulRequestsWhenUnavailable) {
|
| + ClearRequestCounts();
|
| + } else {
|
| + NotifyUnavailabilityIfChanged();
|
| + }
|
| +
|
| + if (!data_reduction_proxy_info.is_fallback) {
|
| + RecordDataReductionProxyBypassInfo(
|
| + true, false, bypassed_proxy, BYPASS_EVENT_TYPE_NETWORK_ERROR);
|
| + RecordDataReductionProxyBypassOnNetworkError(
|
| + true, bypassed_proxy, net_error);
|
| + } else {
|
| + RecordDataReductionProxyBypassInfo(
|
| + false, false, bypassed_proxy, BYPASS_EVENT_TYPE_NETWORK_ERROR);
|
| + RecordDataReductionProxyBypassOnNetworkError(
|
| + false, bypassed_proxy, net_error);
|
| + }
|
| + }
|
| +}
|
| +
|
| +void DataReductionProxyUsageStats::OnConnectComplete(
|
| + const net::HostPortPair& proxy_server,
|
| + int net_error) {
|
| + if (data_reduction_proxy_params_->IsDataReductionProxy(proxy_server, NULL)) {
|
| + UMA_HISTOGRAM_SPARSE_SLOWLY(
|
| + "DataReductionProxy.HTTPConnectCompleted",
|
| + std::abs(net_error));
|
| + }
|
| +}
|
| +
|
| void DataReductionProxyUsageStats::RecordBypassedBytesHistograms(
|
| const net::URLRequest& request,
|
| const BooleanPrefMember& data_reduction_proxy_enabled,
|
| @@ -309,53 +326,63 @@ void DataReductionProxyUsageStats::RecordBypassedBytesHistograms(
|
| }
|
| }
|
|
|
| -void DataReductionProxyUsageStats::OnProxyFallback(
|
| - const net::ProxyServer& bypassed_proxy,
|
| - int net_error) {
|
| - DataReductionProxyTypeInfo data_reduction_proxy_info;
|
| - if (bypassed_proxy.is_valid() && !bypassed_proxy.is_direct() &&
|
| - data_reduction_proxy_params_->IsDataReductionProxy(
|
| - bypassed_proxy.host_port_pair(), &data_reduction_proxy_info)) {
|
| - if (data_reduction_proxy_info.is_ssl)
|
| - return;
|
| -
|
| - proxy_net_errors_count_++;
|
| +void DataReductionProxyUsageStats::RecordMissingViaHeaderBytes(
|
| + const URLRequest& request) {
|
| + // Responses that were served from cache should have been filtered out
|
| + // already.
|
| + DCHECK(!request.was_cached());
|
|
|
| - // To account for the case when the proxy is reachable for sometime, and
|
| - // then gets blocked, we reset counts when number of errors exceed
|
| - // the threshold.
|
| - if (proxy_net_errors_count_ >= kMaxFailedRequestsBeforeReset &&
|
| - successful_requests_through_proxy_count_ >
|
| - kMaxSuccessfulRequestsWhenUnavailable) {
|
| - ClearRequestCounts();
|
| - } else {
|
| - NotifyUnavailabilityIfChanged();
|
| - }
|
| + if (!data_reduction_proxy_params_->WasDataReductionProxyUsed(&request,
|
| + NULL) ||
|
| + HasDataReductionProxyViaHeader(request.response_headers(), NULL)) {
|
| + // Only track requests that used the data reduction proxy and had responses
|
| + // that were missing the data reduction proxy via header.
|
| + return;
|
| + }
|
|
|
| - if (!data_reduction_proxy_info.is_fallback) {
|
| - RecordDataReductionProxyBypassInfo(
|
| - true, false, bypassed_proxy, BYPASS_EVENT_TYPE_NETWORK_ERROR);
|
| - RecordDataReductionProxyBypassOnNetworkError(
|
| - true, bypassed_proxy, net_error);
|
| - } else {
|
| - RecordDataReductionProxyBypassInfo(
|
| - false, false, bypassed_proxy, BYPASS_EVENT_TYPE_NETWORK_ERROR);
|
| - RecordDataReductionProxyBypassOnNetworkError(
|
| - false, bypassed_proxy, net_error);
|
| - }
|
| + if (request.GetResponseCode() >= net::HTTP_BAD_REQUEST &&
|
| + request.GetResponseCode() < net::HTTP_INTERNAL_SERVER_ERROR) {
|
| + // Track 4xx responses that are missing via headers separately.
|
| + UMA_HISTOGRAM_COUNTS("DataReductionProxy.MissingViaHeader.Bytes.4xx",
|
| + request.received_response_content_length());
|
| + } else {
|
| + UMA_HISTOGRAM_COUNTS("DataReductionProxy.MissingViaHeader.Bytes.Other",
|
| + request.received_response_content_length());
|
| }
|
| }
|
|
|
| -void DataReductionProxyUsageStats::OnConnectComplete(
|
| - const net::HostPortPair& proxy_server,
|
| - int net_error) {
|
| - if (data_reduction_proxy_params_->IsDataReductionProxy(proxy_server, NULL)) {
|
| - UMA_HISTOGRAM_SPARSE_SLOWLY(
|
| - "DataReductionProxy.HTTPConnectCompleted",
|
| - std::abs(net_error));
|
| +void DataReductionProxyUsageStats::OnNetworkChanged(
|
| + NetworkChangeNotifier::ConnectionType type) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + ClearRequestCounts();
|
| +}
|
| +
|
| +void DataReductionProxyUsageStats::ClearRequestCounts() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + successful_requests_through_proxy_count_ = 0;
|
| + proxy_net_errors_count_ = 0;
|
| +}
|
| +
|
| +void DataReductionProxyUsageStats::NotifyUnavailabilityIfChanged() {
|
| + bool prev_unavailable = unavailable_;
|
| + unavailable_ =
|
| + (proxy_net_errors_count_ >= kMinFailedRequestsWhenUnavailable &&
|
| + successful_requests_through_proxy_count_ <=
|
| + kMaxSuccessfulRequestsWhenUnavailable);
|
| + if (prev_unavailable != unavailable_) {
|
| + ui_task_runner_->PostTask(FROM_HERE, base::Bind(
|
| + &DataReductionProxyUsageStats::NotifyUnavailabilityOnUIThread,
|
| + base::Unretained(this),
|
| + unavailable_));
|
| }
|
| }
|
|
|
| +void DataReductionProxyUsageStats::NotifyUnavailabilityOnUIThread(
|
| + bool unavailable) {
|
| + DCHECK(ui_task_runner_->BelongsToCurrentThread());
|
| + settings_->SetUnreachable(unavailable);
|
| +}
|
| +
|
| void DataReductionProxyUsageStats::RecordBypassedBytes(
|
| DataReductionProxyBypassType bypass_type,
|
| DataReductionProxyUsageStats::BypassedBytesType bypassed_bytes_type,
|
| @@ -471,31 +498,6 @@ void DataReductionProxyUsageStats::RecordBypassedBytes(
|
| }
|
| }
|
|
|
| -void DataReductionProxyUsageStats::RecordMissingViaHeaderBytes(
|
| - const URLRequest& request) {
|
| - // Responses that were served from cache should have been filtered out
|
| - // already.
|
| - DCHECK(!request.was_cached());
|
| -
|
| - if (!data_reduction_proxy_params_->WasDataReductionProxyUsed(&request,
|
| - NULL) ||
|
| - HasDataReductionProxyViaHeader(request.response_headers(), NULL)) {
|
| - // Only track requests that used the data reduction proxy and had responses
|
| - // that were missing the data reduction proxy via header.
|
| - return;
|
| - }
|
| -
|
| - if (request.GetResponseCode() >= net::HTTP_BAD_REQUEST &&
|
| - request.GetResponseCode() < net::HTTP_INTERNAL_SERVER_ERROR) {
|
| - // Track 4xx responses that are missing via headers separately.
|
| - UMA_HISTOGRAM_COUNTS("DataReductionProxy.MissingViaHeader.Bytes.4xx",
|
| - request.received_response_content_length());
|
| - } else {
|
| - UMA_HISTOGRAM_COUNTS("DataReductionProxy.MissingViaHeader.Bytes.Other",
|
| - request.received_response_content_length());
|
| - }
|
| -}
|
| -
|
| } // namespace data_reduction_proxy
|
|
|
|
|
|
|