Index: net/url_request/url_request_http_job.cc |
diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc |
index dac461d01031d3d780531e13518515a030483747..f8986f7425b863420de06be84eaf9954f4c0b862 100644 |
--- a/net/url_request/url_request_http_job.cc |
+++ b/net/url_request/url_request_http_job.cc |
@@ -73,6 +73,7 @@ class URLRequestHttpJob::HttpFilterContext : public FilterContext { |
const URLRequestContext* GetURLRequestContext() const override; |
void RecordPacketStats(StatisticSelector statistic) const override; |
const BoundNetLog& GetNetLog() const override; |
+ bool IsBrotliEnabled() const override; |
private: |
URLRequestHttpJob* job_; |
@@ -139,6 +140,18 @@ const BoundNetLog& URLRequestHttpJob::HttpFilterContext::GetNetLog() const { |
return job_->request() ? job_->request()->net_log() : dummy_log_; |
} |
+bool URLRequestHttpJob::HttpFilterContext::IsBrotliEnabled() const { |
+ if (!job_->request()) |
+ return false; |
+ const URLRequestContext* context = job_->request()->context(); |
+ if (!context) |
+ return false; |
+ const HttpNetworkSession::Params* params = context->GetNetworkSessionParams(); |
+ if (!params) |
+ return false; |
+ return params->enable_brotli; |
+} |
+ |
// TODO(darin): make sure the port blocking code is not lost |
// static |
URLRequestJob* URLRequestHttpJob::Factory(URLRequest* request, |
@@ -596,30 +609,42 @@ void URLRequestHttpJob::AddExtraHeaders() { |
} |
} |
+ // Advertise "br" encoding only if transferred data is opaque to proxy. |
+ bool advertise_brotli = false; |
+ const HttpNetworkSession::Params* network_session_params = |
+ request()->context()->GetNetworkSessionParams(); |
+ if (network_session_params && network_session_params->enable_brotli) { |
+ advertise_brotli = !request()->url().SchemeIs(url::kHttpScheme); |
+ } |
+ |
// Supply Accept-Encoding headers first so that it is more likely that they |
// will be in the first transmitted packet. This can sometimes make it |
// easier to filter and analyze the streams to assure that a proxy has not |
// damaged these headers. Some proxies deliberately corrupt Accept-Encoding |
// headers. |
- if (!advertise_sdch) { |
- // Tell the server what compression formats we support (other than SDCH). |
- request_info_.extra_headers.SetHeader( |
- HttpRequestHeaders::kAcceptEncoding, "gzip, deflate"); |
- } else { |
- // Include SDCH in acceptable list. |
+ |
+ std::string advertised_encodings = "gzip, deflate"; |
+ if (advertise_sdch) |
+ advertised_encodings += ", sdch"; |
+#if !defined(DISABLE_BROTLI_SUPPORT) |
+ if (advertise_brotli) |
+ advertised_encodings += ", br"; |
+#endif |
+ |
+ // Tell the server what compression formats we support. |
+ request_info_.extra_headers.SetHeader(HttpRequestHeaders::kAcceptEncoding, |
+ advertised_encodings); |
+ |
+ if (advertise_sdch && dictionaries_advertised_) { |
request_info_.extra_headers.SetHeader( |
- HttpRequestHeaders::kAcceptEncoding, "gzip, deflate, sdch"); |
- if (dictionaries_advertised_) { |
- request_info_.extra_headers.SetHeader( |
- kAvailDictionaryHeader, |
- dictionaries_advertised_->GetDictionaryClientHashList()); |
- // Since we're tagging this transaction as advertising a dictionary, |
- // we'll definitely employ an SDCH filter (or tentative sdch filter) |
- // when we get a response. When done, we'll record histograms via |
- // SDCH_DECODE or SDCH_PASSTHROUGH. Hence we need to record packet |
- // arrival times. |
- packet_timing_enabled_ = true; |
- } |
+ kAvailDictionaryHeader, |
+ dictionaries_advertised_->GetDictionaryClientHashList()); |
+ // Since we're tagging this transaction as advertising a dictionary, |
+ // we'll definitely employ an SDCH filter (or tentative sdch filter) |
+ // when we get a response. When done, we'll record histograms via |
+ // SDCH_DECODE or SDCH_PASSTHROUGH. Hence we need to record packet |
+ // arrival times. |
+ packet_timing_enabled_ = true; |
} |
} |