| 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 <limits> | 7 #include <limits> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| 11 #include "base/metrics/histogram_macros.h" | 11 #include "base/metrics/histogram_macros.h" |
| 12 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
| 13 #include "base/time/time.h" | 13 #include "base/time/time.h" |
| 14 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_bypa
ss_stats.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_conf
ig.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
igurator.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_data
.h" | 17 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_data
.h" |
| 18 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_io_d
ata.h" | 18 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_io_d
ata.h" |
| 19 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_requ
est_options.h" | 19 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_requ
est_options.h" |
| 20 #include "components/data_reduction_proxy/core/browser/data_use_group.h" | 20 #include "components/data_reduction_proxy/core/browser/data_use_group.h" |
| 21 #include "components/data_reduction_proxy/core/browser/data_use_group_provider.h
" | 21 #include "components/data_reduction_proxy/core/browser/data_use_group_provider.h
" |
| 22 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_heade
rs.h" |
| 22 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_param
s.h" | 23 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_param
s.h" |
| 23 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_util.
h" | 24 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_util.
h" |
| 24 #include "components/data_reduction_proxy/core/common/lofi_decider.h" | 25 #include "components/data_reduction_proxy/core/common/lofi_decider.h" |
| 25 #include "net/base/load_flags.h" | 26 #include "net/base/load_flags.h" |
| 26 #include "net/base/mime_util.h" | 27 #include "net/base/mime_util.h" |
| 27 #include "net/http/http_request_headers.h" | 28 #include "net/http/http_request_headers.h" |
| 28 #include "net/http/http_response_headers.h" | 29 #include "net/http/http_response_headers.h" |
| 30 #include "net/nqe/effective_connection_type.h" |
| 29 #include "net/nqe/network_quality_estimator.h" | 31 #include "net/nqe/network_quality_estimator.h" |
| 30 #include "net/proxy/proxy_info.h" | 32 #include "net/proxy/proxy_info.h" |
| 31 #include "net/proxy/proxy_server.h" | 33 #include "net/proxy/proxy_server.h" |
| 32 #include "net/proxy/proxy_service.h" | 34 #include "net/proxy/proxy_service.h" |
| 33 #include "net/url_request/url_request.h" | 35 #include "net/url_request/url_request.h" |
| 34 #include "net/url_request/url_request_context.h" | 36 #include "net/url_request/url_request_context.h" |
| 35 #include "net/url_request/url_request_status.h" | 37 #include "net/url_request/url_request_status.h" |
| 36 #include "url/gurl.h" | 38 #include "url/gurl.h" |
| 37 | 39 |
| 38 namespace data_reduction_proxy { | 40 namespace data_reduction_proxy { |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 util::CalculateEffectiveOCL(request); | 131 util::CalculateEffectiveOCL(request); |
| 130 } | 132 } |
| 131 | 133 |
| 132 // Verifies that the chrome proxy related request headers are set correctly. | 134 // Verifies that the chrome proxy related request headers are set correctly. |
| 133 // |via_chrome_proxy| is true if the request is being fetched via Chrome Data | 135 // |via_chrome_proxy| is true if the request is being fetched via Chrome Data |
| 134 // Saver proxy. | 136 // Saver proxy. |
| 135 void VerifyHttpRequestHeaders(bool via_chrome_proxy, | 137 void VerifyHttpRequestHeaders(bool via_chrome_proxy, |
| 136 const net::HttpRequestHeaders& headers) { | 138 const net::HttpRequestHeaders& headers) { |
| 137 if (via_chrome_proxy) { | 139 if (via_chrome_proxy) { |
| 138 DCHECK(headers.HasHeader(chrome_proxy_header())); | 140 DCHECK(headers.HasHeader(chrome_proxy_header())); |
| 141 DCHECK(headers.HasHeader(chrome_proxy_ect_header())); |
| 139 } else { | 142 } else { |
| 140 DCHECK(!headers.HasHeader(chrome_proxy_header())); | 143 DCHECK(!headers.HasHeader(chrome_proxy_header())); |
| 141 DCHECK(!headers.HasHeader(chrome_proxy_accept_transform_header())); | 144 DCHECK(!headers.HasHeader(chrome_proxy_accept_transform_header())); |
| 145 DCHECK(!headers.HasHeader(chrome_proxy_ect_header())); |
| 142 } | 146 } |
| 143 } | 147 } |
| 144 | 148 |
| 145 } // namespace | 149 } // namespace |
| 146 | 150 |
| 147 DataReductionProxyNetworkDelegate::DataReductionProxyNetworkDelegate( | 151 DataReductionProxyNetworkDelegate::DataReductionProxyNetworkDelegate( |
| 148 std::unique_ptr<net::NetworkDelegate> network_delegate, | 152 std::unique_ptr<net::NetworkDelegate> network_delegate, |
| 149 DataReductionProxyConfig* config, | 153 DataReductionProxyConfig* config, |
| 150 DataReductionProxyRequestOptions* request_options, | 154 DataReductionProxyRequestOptions* request_options, |
| 151 const DataReductionProxyConfigurator* configurator) | 155 const DataReductionProxyConfigurator* configurator) |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 // |request|. | 220 // |request|. |
| 217 data_reduction_proxy_io_data_->resource_type_provider()->SetContentType( | 221 data_reduction_proxy_io_data_->resource_type_provider()->SetContentType( |
| 218 *request); | 222 *request); |
| 219 } | 223 } |
| 220 | 224 |
| 221 if (data_reduction_proxy_io_data_->lofi_decider()) { | 225 if (data_reduction_proxy_io_data_->lofi_decider()) { |
| 222 data_reduction_proxy_io_data_->lofi_decider() | 226 data_reduction_proxy_io_data_->lofi_decider() |
| 223 ->MaybeSetAcceptTransformHeader( | 227 ->MaybeSetAcceptTransformHeader( |
| 224 *request, data_reduction_proxy_config_->lofi_off(), headers); | 228 *request, data_reduction_proxy_config_->lofi_off(), headers); |
| 225 } | 229 } |
| 230 |
| 231 MaybeAddChromeProxyECTHeader(headers, *request); |
| 226 } | 232 } |
| 227 | 233 |
| 228 void DataReductionProxyNetworkDelegate::OnBeforeSendHeadersInternal( | 234 void DataReductionProxyNetworkDelegate::OnBeforeSendHeadersInternal( |
| 229 net::URLRequest* request, | 235 net::URLRequest* request, |
| 230 const net::ProxyInfo& proxy_info, | 236 const net::ProxyInfo& proxy_info, |
| 231 const net::ProxyRetryInfoMap& proxy_retry_info, | 237 const net::ProxyRetryInfoMap& proxy_retry_info, |
| 232 net::HttpRequestHeaders* headers) { | 238 net::HttpRequestHeaders* headers) { |
| 233 DCHECK(thread_checker_.CalledOnValidThread()); | 239 DCHECK(thread_checker_.CalledOnValidThread()); |
| 234 DCHECK(data_reduction_proxy_config_); | 240 DCHECK(data_reduction_proxy_config_); |
| 235 DCHECK(request); | 241 DCHECK(request); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 LoFiDecider* lofi_decider = nullptr; | 280 LoFiDecider* lofi_decider = nullptr; |
| 275 if (data_reduction_proxy_io_data_) | 281 if (data_reduction_proxy_io_data_) |
| 276 lofi_decider = data_reduction_proxy_io_data_->lofi_decider(); | 282 lofi_decider = data_reduction_proxy_io_data_->lofi_decider(); |
| 277 | 283 |
| 278 if (!using_data_reduction_proxy) { | 284 if (!using_data_reduction_proxy) { |
| 279 if (lofi_decider) { | 285 if (lofi_decider) { |
| 280 // If not using the data reduction proxy, strip the | 286 // If not using the data reduction proxy, strip the |
| 281 // Chrome-Proxy-Accept-Transform header. | 287 // Chrome-Proxy-Accept-Transform header. |
| 282 lofi_decider->RemoveAcceptTransformHeader(headers); | 288 lofi_decider->RemoveAcceptTransformHeader(headers); |
| 283 } | 289 } |
| 290 RemoveChromeProxyECTHeader(headers); |
| 284 VerifyHttpRequestHeaders(false, *headers); | 291 VerifyHttpRequestHeaders(false, *headers); |
| 285 return; | 292 return; |
| 286 } | 293 } |
| 287 | 294 |
| 288 // Retrieves DataReductionProxyData from a request, creating a new instance | 295 // Retrieves DataReductionProxyData from a request, creating a new instance |
| 289 // if needed. | 296 // if needed. |
| 290 data = DataReductionProxyData::GetDataAndCreateIfNecessary(request); | 297 data = DataReductionProxyData::GetDataAndCreateIfNecessary(request); |
| 291 if (data) { | 298 if (data) { |
| 292 data->set_used_data_reduction_proxy(true); | 299 data->set_used_data_reduction_proxy(true); |
| 293 data->set_session_key( | 300 data->set_session_key( |
| (...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 567 DCHECK_EQ(std::string::npos, header_value.find(kBrotli)); | 574 DCHECK_EQ(std::string::npos, header_value.find(kBrotli)); |
| 568 | 575 |
| 569 request_headers->RemoveHeader(net::HttpRequestHeaders::kAcceptEncoding); | 576 request_headers->RemoveHeader(net::HttpRequestHeaders::kAcceptEncoding); |
| 570 if (!header_value.empty()) | 577 if (!header_value.empty()) |
| 571 header_value += ", "; | 578 header_value += ", "; |
| 572 header_value += kBrotli; | 579 header_value += kBrotli; |
| 573 request_headers->SetHeader(net::HttpRequestHeaders::kAcceptEncoding, | 580 request_headers->SetHeader(net::HttpRequestHeaders::kAcceptEncoding, |
| 574 header_value); | 581 header_value); |
| 575 } | 582 } |
| 576 | 583 |
| 584 void DataReductionProxyNetworkDelegate::MaybeAddChromeProxyECTHeader( |
| 585 net::HttpRequestHeaders* request_headers, |
| 586 const net::URLRequest& request) const { |
| 587 DCHECK(thread_checker_.CalledOnValidThread()); |
| 588 |
| 589 // This method should be called only when the resolved proxy was a data |
| 590 // saver proxy. |
| 591 DCHECK(request.url().is_valid()); |
| 592 DCHECK(!request.url().SchemeIsCryptographic()); |
| 593 DCHECK(request.url().SchemeIsHTTPOrHTTPS()); |
| 594 |
| 595 if (request_headers->HasHeader(chrome_proxy_ect_header())) |
| 596 request_headers->RemoveHeader(chrome_proxy_ect_header()); |
| 597 |
| 598 if (request.context()->network_quality_estimator()) { |
| 599 net::EffectiveConnectionType type = request.context() |
| 600 ->network_quality_estimator() |
| 601 ->GetEffectiveConnectionType(); |
| 602 if (type > net::EFFECTIVE_CONNECTION_TYPE_OFFLINE) { |
| 603 DCHECK_NE(net::EFFECTIVE_CONNECTION_TYPE_LAST, type); |
| 604 request_headers->SetHeader(chrome_proxy_ect_header(), |
| 605 net::GetNameForEffectiveConnectionType(type)); |
| 606 return; |
| 607 } |
| 608 } |
| 609 request_headers->SetHeader(chrome_proxy_ect_header(), |
| 610 net::GetNameForEffectiveConnectionType( |
| 611 net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN)); |
| 612 |
| 613 static_assert(net::EFFECTIVE_CONNECTION_TYPE_OFFLINE + 1 == |
| 614 net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G, |
| 615 "ECT enum value is not handled."); |
| 616 static_assert(net::EFFECTIVE_CONNECTION_TYPE_4G + 1 == |
| 617 net::EFFECTIVE_CONNECTION_TYPE_LAST, |
| 618 "ECT enum value is not handled."); |
| 619 } |
| 620 |
| 621 void DataReductionProxyNetworkDelegate::RemoveChromeProxyECTHeader( |
| 622 net::HttpRequestHeaders* request_headers) const { |
| 623 DCHECK(thread_checker_.CalledOnValidThread()); |
| 624 |
| 625 request_headers->RemoveHeader(chrome_proxy_ect_header()); |
| 626 } |
| 627 |
| 577 } // namespace data_reduction_proxy | 628 } // namespace data_reduction_proxy |
| OLD | NEW |