Chromium Code Reviews| Index: components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc |
| diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc |
| index 9727090d5115ad2b6a9300d20e5ee3b9450ccffb..d24c18602456d42b6940cd291a27b581e0957128 100644 |
| --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc |
| +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.cc |
| @@ -4,6 +4,7 @@ |
| #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_network_delegate.h" |
| +#include <algorithm> |
| #include <limits> |
| #include <utility> |
| @@ -117,18 +118,48 @@ void RecordContentLengthHistograms(bool lofi_low_header_added, |
| received_content_length); |
| } |
| -// Given a |request| that went through the Data Reduction Proxy, this function |
| -// estimates how many bytes would have been received if the response had been |
| -// received directly from the origin using HTTP/1.1 with a content length of |
| -// |adjusted_original_content_length|. |
| -int64_t EstimateOriginalReceivedBytes(const net::URLRequest& request) { |
| +// Estimate the size of the original headers of |request|. If |used_drp| is |
| +// true, then it's assumed that the original request would have used HTTP/1.1, |
| +// otherwise it assumes that the original request would have used the same |
| +// protocol as |request| did. This is to account for stuff like HTTP/2 header |
| +// compression. |
| +int64_t EstimateOriginalHeaderBytes(const net::URLRequest& request, |
| + bool used_drp) { |
| + if (used_drp) { |
| + // TODO(sclittle): Remove headers added by Data Reduction Proxy when |
| + // computing original size. https://crbug.com/535701. |
| + return request.response_headers()->raw_headers().size(); |
| + } |
| + return std::max<int64_t>(0, request.GetTotalReceivedBytes() - |
|
RyanSturm
2017/05/10 18:14:08
As a note, I don't believe GetTotalReceivedBytes c
sclittle
2017/05/10 19:56:36
From looking at URLRequest::GetTotalReceivedBytes(
|
| + request.received_response_content_length()); |
| +} |
| + |
| +// Given a |request| that went through the Data Reduction Proxy if |used_drp| is |
| +// true, this function estimates how many bytes would have been received if the |
| +// response had been received directly from the origin without any data saver |
| +// optimizations. |
| +int64_t EstimateOriginalReceivedBytes(const net::URLRequest& request, |
| + bool used_drp, |
| + const LoFiDecider* lofi_decider) { |
| if (request.was_cached() || !request.response_headers()) |
| return request.GetTotalReceivedBytes(); |
| - // TODO(sclittle): Remove headers added by Data Reduction Proxy when computing |
| - // original size. http://crbug/535701. |
| - return request.response_headers()->raw_headers().size() + |
| - util::CalculateEffectiveOCL(request); |
| + if (lofi_decider) { |
| + if (lofi_decider->IsClientLoFiAutoReloadRequest(request)) |
| + return 0; |
| + |
| + int64_t first, last, length; |
| + if (lofi_decider->IsClientLoFiImageRequest(request) && |
| + request.response_headers()->GetContentRangeFor206(&first, &last, |
| + &length) && |
| + length > request.received_response_content_length()) { |
| + return EstimateOriginalHeaderBytes(request, used_drp) + length; |
| + } |
| + } |
| + |
| + return used_drp ? EstimateOriginalHeaderBytes(request, used_drp) + |
| + util::CalculateEffectiveOCL(request) |
| + : request.GetTotalReceivedBytes(); |
| } |
| // Verifies that the chrome proxy related request headers are set correctly. |
| @@ -451,10 +482,11 @@ void DataReductionProxyNetworkDelegate::CalculateAndRecordDataUsage( |
| // Estimate how many bytes would have been used if the DataReductionProxy was |
| // not used, and record the data usage. |
| - int64_t original_size = data_used; |
| - |
| - if (request_type == VIA_DATA_REDUCTION_PROXY) |
| - original_size = EstimateOriginalReceivedBytes(request); |
| + int64_t original_size = EstimateOriginalReceivedBytes( |
| + request, request_type == VIA_DATA_REDUCTION_PROXY, |
| + data_reduction_proxy_io_data_ |
| + ? data_reduction_proxy_io_data_->lofi_decider() |
| + : nullptr); |
| std::string mime_type; |
| if (request.response_headers()) |