summaryrefslogtreecommitdiff
path: root/chromium/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc')
-rw-r--r--chromium/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc176
1 files changed, 137 insertions, 39 deletions
diff --git a/chromium/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc b/chromium/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc
index 8bae820f90e..12d8b56770d 100644
--- a/chromium/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc
+++ b/chromium/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc
@@ -23,6 +23,7 @@
#include "components/data_reduction_proxy/core/common/data_reduction_proxy_util.h"
#include "components/data_reduction_proxy/core/common/lofi_decider.h"
#include "net/base/load_flags.h"
+#include "net/base/mime_util.h"
#include "net/http/http_request_headers.h"
#include "net/http/http_response_headers.h"
#include "net/nqe/network_quality_estimator.h"
@@ -46,27 +47,31 @@ namespace {
// |freshness_lifetime| contains information on how long the resource will be
// fresh for and how long is the usability.
void RecordContentLengthHistograms(bool lofi_low_header_added,
+ bool is_https,
+ bool is_video,
int64_t received_content_length,
int64_t original_content_length,
const base::TimeDelta& freshness_lifetime) {
// Add the current resource to these histograms only when a valid
// X-Original-Content-Length header is present.
if (original_content_length >= 0) {
- UMA_HISTOGRAM_COUNTS("Net.HttpContentLengthWithValidOCL",
- received_content_length);
- UMA_HISTOGRAM_COUNTS("Net.HttpOriginalContentLengthWithValidOCL",
- original_content_length);
- UMA_HISTOGRAM_COUNTS("Net.HttpContentLengthDifferenceWithValidOCL",
- original_content_length - received_content_length);
+ UMA_HISTOGRAM_COUNTS_1M("Net.HttpContentLengthWithValidOCL",
+ received_content_length);
+ UMA_HISTOGRAM_COUNTS_1M("Net.HttpOriginalContentLengthWithValidOCL",
+ original_content_length);
+ UMA_HISTOGRAM_COUNTS_1M("Net.HttpContentLengthDifferenceWithValidOCL",
+ original_content_length - received_content_length);
// Populate Lo-Fi content length histograms.
if (lofi_low_header_added) {
- UMA_HISTOGRAM_COUNTS("Net.HttpContentLengthWithValidOCL.LoFiOn",
- received_content_length);
- UMA_HISTOGRAM_COUNTS("Net.HttpOriginalContentLengthWithValidOCL.LoFiOn",
- original_content_length);
- UMA_HISTOGRAM_COUNTS("Net.HttpContentLengthDifferenceWithValidOCL.LoFiOn",
- original_content_length - received_content_length);
+ UMA_HISTOGRAM_COUNTS_1M("Net.HttpContentLengthWithValidOCL.LoFiOn",
+ received_content_length);
+ UMA_HISTOGRAM_COUNTS_1M(
+ "Net.HttpOriginalContentLengthWithValidOCL.LoFiOn",
+ original_content_length);
+ UMA_HISTOGRAM_COUNTS_1M(
+ "Net.HttpContentLengthDifferenceWithValidOCL.LoFiOn",
+ original_content_length - received_content_length);
}
} else {
@@ -74,11 +79,22 @@ void RecordContentLengthHistograms(bool lofi_low_header_added,
// length if the X-Original-Content-Header is not present.
original_content_length = received_content_length;
}
- UMA_HISTOGRAM_COUNTS("Net.HttpContentLength", received_content_length);
- UMA_HISTOGRAM_COUNTS("Net.HttpOriginalContentLength",
- original_content_length);
- UMA_HISTOGRAM_COUNTS("Net.HttpContentLengthDifference",
- original_content_length - received_content_length);
+ UMA_HISTOGRAM_COUNTS_1M("Net.HttpContentLength", received_content_length);
+ if (is_https) {
+ UMA_HISTOGRAM_COUNTS_1M("Net.HttpContentLength.Https",
+ received_content_length);
+ } else {
+ UMA_HISTOGRAM_COUNTS_1M("Net.HttpContentLength.Http",
+ received_content_length);
+ }
+ if (is_video) {
+ UMA_HISTOGRAM_COUNTS_1M("Net.HttpContentLength.Video",
+ received_content_length);
+ }
+ UMA_HISTOGRAM_COUNTS_1M("Net.HttpOriginalContentLength",
+ original_content_length);
+ UMA_HISTOGRAM_COUNTS_1M("Net.HttpContentLengthDifference",
+ original_content_length - received_content_length);
UMA_HISTOGRAM_CUSTOM_COUNTS("Net.HttpContentFreshnessLifetime",
freshness_lifetime.InSeconds(),
base::TimeDelta::FromHours(1).InSeconds(),
@@ -86,17 +102,17 @@ void RecordContentLengthHistograms(bool lofi_low_header_added,
100);
if (freshness_lifetime.InSeconds() <= 0)
return;
- UMA_HISTOGRAM_COUNTS("Net.HttpContentLengthCacheable",
- received_content_length);
+ UMA_HISTOGRAM_COUNTS_1M("Net.HttpContentLengthCacheable",
+ received_content_length);
if (freshness_lifetime.InHours() < 4)
return;
- UMA_HISTOGRAM_COUNTS("Net.HttpContentLengthCacheable4Hours",
- received_content_length);
+ UMA_HISTOGRAM_COUNTS_1M("Net.HttpContentLengthCacheable4Hours",
+ received_content_length);
if (freshness_lifetime.InHours() < 24)
return;
- UMA_HISTOGRAM_COUNTS("Net.HttpContentLengthCacheable24Hours",
- received_content_length);
+ UMA_HISTOGRAM_COUNTS_1M("Net.HttpContentLengthCacheable24Hours",
+ received_content_length);
}
// Given a |request| that went through the Data Reduction Proxy, this function
@@ -113,6 +129,19 @@ int64_t EstimateOriginalReceivedBytes(const net::URLRequest& request) {
util::CalculateEffectiveOCL(request);
}
+// Verifies that the chrome proxy related request headers are set correctly.
+// |via_chrome_proxy| is true if the request is being fetched via Chrome Data
+// Saver proxy.
+void VerifyHttpRequestHeaders(bool via_chrome_proxy,
+ const net::HttpRequestHeaders& headers) {
+ if (via_chrome_proxy) {
+ DCHECK(headers.HasHeader(chrome_proxy_header()));
+ } else {
+ DCHECK(!headers.HasHeader(chrome_proxy_header()));
+ DCHECK(!headers.HasHeader(chrome_proxy_accept_transform_header()));
+ }
+}
+
} // namespace
DataReductionProxyNetworkDelegate::DataReductionProxyNetworkDelegate(
@@ -205,6 +234,17 @@ void DataReductionProxyNetworkDelegate::OnBeforeSendHeadersInternal(
DCHECK(data_reduction_proxy_config_);
DCHECK(request);
+ // If there was a redirect or request bypass, use the same page ID for both
+ // requests. As long as the session ID has not changed. Re-issued requests
+ // and client redirects will be assigned a new page ID as they are different
+ // URLRequests.
+ DataReductionProxyData* data = DataReductionProxyData::GetData(*request);
+ base::Optional<uint64_t> page_id;
+ if (data && data->session_key() ==
+ data_reduction_proxy_request_options_->GetSecureSession()) {
+ page_id = data->page_id();
+ }
+
// Reset |request|'s DataReductionProxyData.
DataReductionProxyData::ClearData(request);
@@ -212,10 +252,10 @@ void DataReductionProxyNetworkDelegate::OnBeforeSendHeadersInternal(
if (!WasEligibleWithoutHoldback(*request, proxy_info, proxy_retry_info))
return;
// For the holdback field trial, still log UMA as if the proxy was used.
- DataReductionProxyData* data =
- DataReductionProxyData::GetDataAndCreateIfNecessary(request);
+ data = DataReductionProxyData::GetDataAndCreateIfNecessary(request);
if (data)
data->set_used_data_reduction_proxy(true);
+ VerifyHttpRequestHeaders(false, *headers);
return;
}
@@ -241,23 +281,26 @@ void DataReductionProxyNetworkDelegate::OnBeforeSendHeadersInternal(
// Chrome-Proxy-Accept-Transform header.
lofi_decider->RemoveAcceptTransformHeader(headers);
}
+ VerifyHttpRequestHeaders(false, *headers);
return;
}
// Retrieves DataReductionProxyData from a request, creating a new instance
// if needed.
- DataReductionProxyData* data =
- DataReductionProxyData::GetDataAndCreateIfNecessary(request);
+ data = DataReductionProxyData::GetDataAndCreateIfNecessary(request);
if (data) {
data->set_used_data_reduction_proxy(true);
- data->set_session_key(
- data_reduction_proxy_request_options_->GetSecureSession());
- data->set_request_url(request->url());
- if ((request->load_flags() & net::LOAD_MAIN_FRAME_DEPRECATED) &&
- request->context()->network_quality_estimator()) {
- data->set_effective_connection_type(request->context()
- ->network_quality_estimator()
- ->GetEffectiveConnectionType());
+ // Only set GURL, NQE and session key string for main frame requests since
+ // they are not needed for sub-resources.
+ if (request->load_flags() & net::LOAD_MAIN_FRAME_DEPRECATED) {
+ data->set_session_key(
+ data_reduction_proxy_request_options_->GetSecureSession());
+ data->set_request_url(request->url());
+ if (request->context()->network_quality_estimator()) {
+ data->set_effective_connection_type(request->context()
+ ->network_quality_estimator()
+ ->GetEffectiveConnectionType());
+ }
}
}
@@ -274,17 +317,46 @@ void DataReductionProxyNetworkDelegate::OnBeforeSendHeadersInternal(
}
MaybeAddBrotliToAcceptEncodingHeader(proxy_info, headers, *request);
- data_reduction_proxy_request_options_->AddRequestHeader(headers);
+ // Generate a page ID for main frame requests that don't already have one.
+ // TODO(ryansturm): remove LOAD_MAIN_FRAME_DEPRECATED from d_r_p.
+ // crbug.com/709621
+ if (request->load_flags() & net::LOAD_MAIN_FRAME_DEPRECATED) {
+ if (!page_id) {
+ page_id = data_reduction_proxy_request_options_->GeneratePageId();
+ }
+ data->set_page_id(page_id.value());
+ }
+
+ data_reduction_proxy_request_options_->AddRequestHeader(headers, page_id);
+
if (lofi_decider)
lofi_decider->MaybeSetIgnorePreviewsBlacklistDirective(headers);
+ VerifyHttpRequestHeaders(true, *headers);
}
void DataReductionProxyNetworkDelegate::OnBeforeRedirectInternal(
net::URLRequest* request,
const GURL& new_location) {
// Since this is after a redirect response, reset |request|'s
- // DataReductionProxyData.
+ // DataReductionProxyData, but keep page ID and session.
+ // TODO(ryansturm): Change ClearData logic to have persistent and
+ // non-persistent (WRT redirects) data.
+ // crbug.com/709564
+ DataReductionProxyData* data = DataReductionProxyData::GetData(*request);
+ base::Optional<uint64_t> page_id;
+ if (data && data->session_key() ==
+ data_reduction_proxy_request_options_->GetSecureSession()) {
+ page_id = data->page_id();
+ }
+
DataReductionProxyData::ClearData(request);
+
+ if (page_id) {
+ data = DataReductionProxyData::GetDataAndCreateIfNecessary(request);
+ data->set_page_id(page_id.value());
+ data->set_session_key(
+ data_reduction_proxy_request_options_->GetSecureSession());
+ }
}
void DataReductionProxyNetworkDelegate::OnCompletedInternal(
@@ -338,6 +410,25 @@ void DataReductionProxyNetworkDelegate::OnCompletedInternal(
RecordContentLength(*request, request_type, original_content_length);
}
+void DataReductionProxyNetworkDelegate::OnHeadersReceivedInternal(
+ net::URLRequest* request,
+ const net::CompletionCallback& callback,
+ const net::HttpResponseHeaders* original_response_headers,
+ scoped_refptr<net::HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url) {
+ if (!original_response_headers)
+ return;
+ if (IsEmptyImagePreview(*original_response_headers)) {
+ DataReductionProxyData* data =
+ DataReductionProxyData::GetDataAndCreateIfNecessary(request);
+ data->set_lofi_received(true);
+ } else if (IsLitePagePreview(*original_response_headers)) {
+ DataReductionProxyData* data =
+ DataReductionProxyData::GetDataAndCreateIfNecessary(request);
+ data->set_lite_page_received(true);
+ }
+}
+
void DataReductionProxyNetworkDelegate::CalculateAndRecordDataUsage(
const net::URLRequest& request,
DataReductionProxyRequestType request_type) {
@@ -395,14 +486,21 @@ void DataReductionProxyNetworkDelegate::RecordContentLength(
->GetFreshnessLifetimes(request.response_info().response_time)
.freshness;
+ bool is_https = request.url().SchemeIs("https");
+ bool is_video = false;
+ std::string mime_type;
+ if (request.response_headers()->GetMimeType(&mime_type)) {
+ is_video = net::MatchesMimeType("video/*", mime_type);
+ }
+
RecordContentLengthHistograms(
// |data_reduction_proxy_io_data_| can be NULL for Webview.
data_reduction_proxy_io_data_ &&
data_reduction_proxy_io_data_->IsEnabled() &&
data_reduction_proxy_io_data_->lofi_decider() &&
data_reduction_proxy_io_data_->lofi_decider()->IsUsingLoFi(request),
- request.received_response_content_length(), original_content_length,
- freshness_lifetime);
+ is_https, is_video, request.received_response_content_length(),
+ original_content_length, freshness_lifetime);
if (data_reduction_proxy_io_data_ && data_reduction_proxy_bypass_stats_) {
// Record BypassedBytes histograms for the request.