OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_netw
ork_delegate.h" | 5 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_netw
ork_delegate.h" |
6 | 6 |
| 7 #include <algorithm> |
7 #include <limits> | 8 #include <limits> |
8 #include <utility> | 9 #include <utility> |
9 | 10 |
10 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
11 #include "base/metrics/histogram_macros.h" | 12 #include "base/metrics/histogram_macros.h" |
12 #include "base/strings/string_number_conversions.h" | 13 #include "base/strings/string_number_conversions.h" |
13 #include "base/time/time.h" | 14 #include "base/time/time.h" |
14 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_bypa
ss_stats.h" | 15 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_bypa
ss_stats.h" |
15 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_conf
ig.h" | 16 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_conf
ig.h" |
16 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_conf
igurator.h" | 17 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_conf
igurator.h" |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
110 return; | 111 return; |
111 UMA_HISTOGRAM_COUNTS_1M("Net.HttpContentLengthCacheable4Hours", | 112 UMA_HISTOGRAM_COUNTS_1M("Net.HttpContentLengthCacheable4Hours", |
112 received_content_length); | 113 received_content_length); |
113 | 114 |
114 if (freshness_lifetime.InHours() < 24) | 115 if (freshness_lifetime.InHours() < 24) |
115 return; | 116 return; |
116 UMA_HISTOGRAM_COUNTS_1M("Net.HttpContentLengthCacheable24Hours", | 117 UMA_HISTOGRAM_COUNTS_1M("Net.HttpContentLengthCacheable24Hours", |
117 received_content_length); | 118 received_content_length); |
118 } | 119 } |
119 | 120 |
120 // Given a |request| that went through the Data Reduction Proxy, this function | 121 // Estimate the size of the original headers of |request|. If |used_drp| is |
121 // estimates how many bytes would have been received if the response had been | 122 // true, then it's assumed that the original request would have used HTTP/1.1, |
122 // received directly from the origin using HTTP/1.1 with a content length of | 123 // otherwise it assumes that the original request would have used the same |
123 // |adjusted_original_content_length|. | 124 // protocol as |request| did. This is to account for stuff like HTTP/2 header |
124 int64_t EstimateOriginalReceivedBytes(const net::URLRequest& request) { | 125 // compression. |
| 126 int64_t EstimateOriginalHeaderBytes(const net::URLRequest& request, |
| 127 bool used_drp) { |
| 128 if (used_drp) { |
| 129 // TODO(sclittle): Remove headers added by Data Reduction Proxy when |
| 130 // computing original size. https://crbug.com/535701. |
| 131 return request.response_headers()->raw_headers().size(); |
| 132 } |
| 133 return std::max<int64_t>(0, request.GetTotalReceivedBytes() - |
| 134 request.received_response_content_length()); |
| 135 } |
| 136 |
| 137 // Given a |request| that went through the Data Reduction Proxy if |used_drp| is |
| 138 // true, this function estimates how many bytes would have been received if the |
| 139 // response had been received directly from the origin without any data saver |
| 140 // optimizations. |
| 141 int64_t EstimateOriginalReceivedBytes(const net::URLRequest& request, |
| 142 bool used_drp, |
| 143 const LoFiDecider* lofi_decider) { |
125 if (request.was_cached() || !request.response_headers()) | 144 if (request.was_cached() || !request.response_headers()) |
126 return request.GetTotalReceivedBytes(); | 145 return request.GetTotalReceivedBytes(); |
127 | 146 |
128 // TODO(sclittle): Remove headers added by Data Reduction Proxy when computing | 147 if (lofi_decider) { |
129 // original size. http://crbug/535701. | 148 if (lofi_decider->IsClientLoFiAutoReloadRequest(request)) |
130 return request.response_headers()->raw_headers().size() + | 149 return 0; |
131 util::CalculateEffectiveOCL(request); | 150 |
| 151 int64_t first, last, length; |
| 152 if (lofi_decider->IsClientLoFiImageRequest(request) && |
| 153 request.response_headers()->GetContentRangeFor206(&first, &last, |
| 154 &length) && |
| 155 length > request.received_response_content_length()) { |
| 156 return EstimateOriginalHeaderBytes(request, used_drp) + length; |
| 157 } |
| 158 } |
| 159 |
| 160 return used_drp ? EstimateOriginalHeaderBytes(request, used_drp) + |
| 161 util::CalculateEffectiveOCL(request) |
| 162 : request.GetTotalReceivedBytes(); |
132 } | 163 } |
133 | 164 |
134 // Verifies that the chrome proxy related request headers are set correctly. | 165 // Verifies that the chrome proxy related request headers are set correctly. |
135 // |via_chrome_proxy| is true if the request is being fetched via Chrome Data | 166 // |via_chrome_proxy| is true if the request is being fetched via Chrome Data |
136 // Saver proxy. | 167 // Saver proxy. |
137 void VerifyHttpRequestHeaders(bool via_chrome_proxy, | 168 void VerifyHttpRequestHeaders(bool via_chrome_proxy, |
138 const net::HttpRequestHeaders& headers) { | 169 const net::HttpRequestHeaders& headers) { |
139 if (via_chrome_proxy) { | 170 if (via_chrome_proxy) { |
140 DCHECK(headers.HasHeader(chrome_proxy_header())); | 171 DCHECK(headers.HasHeader(chrome_proxy_header())); |
141 DCHECK(headers.HasHeader(chrome_proxy_ect_header())); | 172 DCHECK(headers.HasHeader(chrome_proxy_ect_header())); |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 DCHECK(request); | 404 DCHECK(request); |
374 // TODO(maksims): remove this once OnCompletedInternal() has net_error in | 405 // TODO(maksims): remove this once OnCompletedInternal() has net_error in |
375 // arguments. | 406 // arguments. |
376 int net_error = request->status().error(); | 407 int net_error = request->status().error(); |
377 DCHECK_NE(net::ERR_IO_PENDING, net_error); | 408 DCHECK_NE(net::ERR_IO_PENDING, net_error); |
378 if (data_reduction_proxy_bypass_stats_) | 409 if (data_reduction_proxy_bypass_stats_) |
379 data_reduction_proxy_bypass_stats_->OnUrlRequestCompleted(request, started, | 410 data_reduction_proxy_bypass_stats_->OnUrlRequestCompleted(request, started, |
380 net_error); | 411 net_error); |
381 | 412 |
382 net::HttpRequestHeaders request_headers; | 413 net::HttpRequestHeaders request_headers; |
383 bool server_lofi = data_reduction_proxy_io_data_ && | 414 bool server_lofi = request->response_headers() && |
384 request->response_headers() && | |
385 IsEmptyImagePreview(*(request->response_headers())); | 415 IsEmptyImagePreview(*(request->response_headers())); |
386 bool client_lofi = | 416 bool client_lofi = |
387 data_reduction_proxy_io_data_ && | 417 data_reduction_proxy_io_data_ && |
388 data_reduction_proxy_io_data_->lofi_decider() && | 418 data_reduction_proxy_io_data_->lofi_decider() && |
389 data_reduction_proxy_io_data_->lofi_decider()->IsClientLoFiImageRequest( | 419 data_reduction_proxy_io_data_->lofi_decider()->IsClientLoFiImageRequest( |
390 *request); | 420 *request); |
391 if (server_lofi || client_lofi) { | 421 if ((server_lofi || client_lofi) && data_reduction_proxy_io_data_ && |
| 422 data_reduction_proxy_io_data_->lofi_ui_service()) { |
392 data_reduction_proxy_io_data_->lofi_ui_service()->OnLoFiReponseReceived( | 423 data_reduction_proxy_io_data_->lofi_ui_service()->OnLoFiReponseReceived( |
393 *request); | 424 *request); |
394 } else if (data_reduction_proxy_io_data_ && request->response_headers() && | 425 } else if (data_reduction_proxy_io_data_ && request->response_headers() && |
395 IsLitePagePreview(*(request->response_headers()))) { | 426 IsLitePagePreview(*(request->response_headers()))) { |
396 RecordLitePageTransformationType(LITE_PAGE); | 427 RecordLitePageTransformationType(LITE_PAGE); |
397 } else if (request->GetFullRequestHeaders(&request_headers)) { | 428 } else if (request->GetFullRequestHeaders(&request_headers)) { |
398 // TODO(bengr): transform processing logic should happen elsewhere. | 429 // TODO(bengr): transform processing logic should happen elsewhere. |
399 std::string header_value; | 430 std::string header_value; |
400 request_headers.GetHeader(chrome_proxy_accept_transform_header(), | 431 request_headers.GetHeader(chrome_proxy_accept_transform_header(), |
401 &header_value); | 432 &header_value); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
444 } | 475 } |
445 | 476 |
446 void DataReductionProxyNetworkDelegate::CalculateAndRecordDataUsage( | 477 void DataReductionProxyNetworkDelegate::CalculateAndRecordDataUsage( |
447 const net::URLRequest& request, | 478 const net::URLRequest& request, |
448 DataReductionProxyRequestType request_type) { | 479 DataReductionProxyRequestType request_type) { |
449 DCHECK(thread_checker_.CalledOnValidThread()); | 480 DCHECK(thread_checker_.CalledOnValidThread()); |
450 int64_t data_used = request.GetTotalReceivedBytes(); | 481 int64_t data_used = request.GetTotalReceivedBytes(); |
451 | 482 |
452 // Estimate how many bytes would have been used if the DataReductionProxy was | 483 // Estimate how many bytes would have been used if the DataReductionProxy was |
453 // not used, and record the data usage. | 484 // not used, and record the data usage. |
454 int64_t original_size = data_used; | 485 int64_t original_size = EstimateOriginalReceivedBytes( |
455 | 486 request, request_type == VIA_DATA_REDUCTION_PROXY, |
456 if (request_type == VIA_DATA_REDUCTION_PROXY) | 487 data_reduction_proxy_io_data_ |
457 original_size = EstimateOriginalReceivedBytes(request); | 488 ? data_reduction_proxy_io_data_->lofi_decider() |
| 489 : nullptr); |
458 | 490 |
459 std::string mime_type; | 491 std::string mime_type; |
460 if (request.response_headers()) | 492 if (request.response_headers()) |
461 request.response_headers()->GetMimeType(&mime_type); | 493 request.response_headers()->GetMimeType(&mime_type); |
462 | 494 |
463 scoped_refptr<DataUseGroup> data_use_group = | 495 scoped_refptr<DataUseGroup> data_use_group = |
464 data_use_group_provider_ | 496 data_use_group_provider_ |
465 ? data_use_group_provider_->GetDataUseGroup(&request) | 497 ? data_use_group_provider_->GetDataUseGroup(&request) |
466 : nullptr; | 498 : nullptr; |
467 AccumulateDataUsage(data_used, original_size, request_type, data_use_group, | 499 AccumulateDataUsage(data_used, original_size, request_type, data_use_group, |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
648 } | 680 } |
649 | 681 |
650 void DataReductionProxyNetworkDelegate::RemoveChromeProxyECTHeader( | 682 void DataReductionProxyNetworkDelegate::RemoveChromeProxyECTHeader( |
651 net::HttpRequestHeaders* request_headers) const { | 683 net::HttpRequestHeaders* request_headers) const { |
652 DCHECK(thread_checker_.CalledOnValidThread()); | 684 DCHECK(thread_checker_.CalledOnValidThread()); |
653 | 685 |
654 request_headers->RemoveHeader(chrome_proxy_ect_header()); | 686 request_headers->RemoveHeader(chrome_proxy_ect_header()); |
655 } | 687 } |
656 | 688 |
657 } // namespace data_reduction_proxy | 689 } // namespace data_reduction_proxy |
OLD | NEW |