Index: components/data_reduction_proxy/core/common/data_reduction_proxy_headers.cc |
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.cc b/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.cc |
index ef1e77faa3d285d7bf8659c86e794643d9dfe712..fe139ab1121e5d3cc1ebfcf990d717e82a748317 100644 |
--- a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.cc |
+++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.cc |
@@ -43,6 +43,7 @@ const char kActionValueDelimiter = '='; |
const char kEmptyImageDirective[] = "empty-image"; |
const char kLitePageDirective[] = "lite-page"; |
const char kCompressedVideoDirective[] = "compressed-video"; |
+const char kChromeProxyPagePoliciesDirective[] = "page-policies"; |
// The legacy Chrome-Proxy response header directive for LoFi images. |
const char kLegacyChromeProxyLoFiResponseDirective[] = "q=low"; |
@@ -121,6 +122,30 @@ bool HasURLRedirectCycle(const std::vector<GURL>& url_chain) { |
url_chain.back()) != url_chain.rend(); |
} |
+data_reduction_proxy::TransformDirective ParsePagePolicyDirective( |
+ const std::string chrome_proxy_header_value) { |
+ for (const auto& directive : base::SplitStringPiece( |
+ chrome_proxy_header_value, ",", base::TRIM_WHITESPACE, |
+ base::SPLIT_WANT_NONEMPTY)) { |
+ if (!base::StartsWith(directive, kChromeProxyPagePoliciesDirective, |
+ base::CompareCase::INSENSITIVE_ASCII)) { |
+ continue; |
+ } |
+ |
+ // Check policy directive for empty-image entry. |
+ base::StringPiece page_policies_value = base::StringPiece(directive).substr( |
+ arraysize(kChromeProxyPagePoliciesDirective)); |
+ for (const auto& policy : |
+ base::SplitStringPiece(page_policies_value, "|", base::TRIM_WHITESPACE, |
+ base::SPLIT_WANT_NONEMPTY)) { |
+ if (base::LowerCaseEqualsASCII(policy, kEmptyImageDirective)) { |
+ return data_reduction_proxy::TRANSFORM_PAGE_POLICIES_EMPTY_IMAGE; |
+ } |
+ } |
+ } |
+ return data_reduction_proxy::TRANSFORM_NONE; |
+} |
+ |
} // namespace |
namespace data_reduction_proxy { |
@@ -169,6 +194,52 @@ const char* if_heavy_qualifier() { |
return kIfHeavyQualifier; |
} |
+TransformDirective ParseRequestTransform( |
+ const net::HttpRequestHeaders& headers) { |
+ std::string accept_transform_value; |
+ if (!headers.GetHeader(chrome_proxy_accept_transform_header(), |
+ &accept_transform_value)) { |
+ return TRANSFORM_NONE; |
+ } |
+ |
+ if (base::LowerCaseEqualsASCII(accept_transform_value, |
+ lite_page_directive())) { |
+ return TRANSFORM_LITE_PAGE; |
+ } else if (base::LowerCaseEqualsASCII(accept_transform_value, |
+ empty_image_directive())) { |
+ return TRANSFORM_EMPTY_IMAGE; |
+ } else if (base::LowerCaseEqualsASCII(accept_transform_value, |
+ compressed_video_directive())) { |
+ return TRANSFORM_COMPRESSED_VIDEO; |
+ } else { |
+ return TRANSFORM_NONE; |
+ } |
+} |
+ |
+TransformDirective ParseResponseTransform( |
+ const net::HttpResponseHeaders& headers) { |
+ std::string content_transform_value; |
+ if (!headers.GetNormalizedHeader(chrome_proxy_content_transform_header(), |
+ &content_transform_value)) { |
+ // No content-transform so check for page-policies in chrome-proxy header. |
+ std::string chrome_proxy_header_value; |
+ if (headers.GetNormalizedHeader(chrome_proxy_header(), |
+ &chrome_proxy_header_value)) { |
+ return ParsePagePolicyDirective(chrome_proxy_header_value); |
+ } |
+ } else if (base::LowerCaseEqualsASCII(content_transform_value, |
+ lite_page_directive())) { |
+ return TRANSFORM_LITE_PAGE; |
+ } else if (base::LowerCaseEqualsASCII(content_transform_value, |
+ empty_image_directive())) { |
+ return TRANSFORM_EMPTY_IMAGE; |
+ } else { |
+ NOTREACHED() << "Unexpected content transform header: " |
+ << content_transform_value; |
+ } |
+ return TRANSFORM_NONE; |
+} |
+ |
bool IsEmptyImagePreview(const net::HttpResponseHeaders& headers) { |
return IsPreviewType(headers, kEmptyImageDirective) || |
headers.HasHeaderValue(kChromeProxyHeader, |