| 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 |