Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(218)

Unified Diff: components/data_reduction_proxy/core/common/data_reduction_proxy_headers.cc

Issue 2800473002: Treat responses with legacy LoFi headers as LoFi images. (Closed)
Patch Set: Rebased on master Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 b22ead117605921d6339e1db33e9efd8ae14265a..3a697aecaf897b97408cf67eec4fbecad88bc753 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
@@ -20,6 +20,7 @@
#include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
#include "net/http/http_response_headers.h"
#include "net/http/http_status_code.h"
+#include "net/http/http_util.h"
#include "net/url_request/url_request.h"
using base::StringPiece;
@@ -41,6 +42,9 @@ const char kLitePageDirective[] = "lite-page";
const char kCompressedVideoDirective[] = "compressed-video";
const char kIdentityDirective[] = "identity";
+// The legacy Chrome-Proxy response header directive for LoFi images.
+const char kLegacyChromeProxyLoFiResponseDirective[] = "q=low";
+
const char kChromeProxyLitePageIngoreBlacklistDirective[] =
"exp=ignore_preview_blacklist";
@@ -81,29 +85,26 @@ bool StartsWithActionPrefix(base::StringPiece header_value,
// Returns true if the provided transform type is specified in the provided
// Chrome-Proxy-Content-Transform header value.
-bool IsPreviewTypeInHeaderValue(const std::string& header_value,
- const std::string& transform_type) {
- std::vector<std::string> tokens =
- base::SplitString(base::ToLowerASCII(header_value), ";",
- base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
- if (tokens.empty())
- return false;
- std::string header_transform_type;
- base::TrimWhitespaceASCII(tokens[0], base::TRIM_ALL, &header_transform_type);
- return header_transform_type == transform_type;
+bool IsPreviewTypeInHeaderValue(base::StringPiece header_value,
+ base::StringPiece transform_type) {
+ DCHECK_EQ(transform_type, base::ToLowerASCII(transform_type));
+
+ // The Chrome-Proxy-Content-Transform header consists of a single
+ // transformation type string followed by zero or more semicolon-delimited
+ // options, e.g. "empty-image", "empty-image;foo-option".
+ base::StringPiece token = base::TrimWhitespaceASCII(
+ header_value.substr(0, header_value.find(';')), base::TRIM_ALL);
+ return base::LowerCaseEqualsASCII(token, transform_type);
}
// Returns true if the provided transform type is specified in the
// Chrome-Proxy-Content-Transform-Header.
bool IsPreviewType(const net::HttpResponseHeaders& headers,
- const std::string& transform_type) {
- std::string header_value;
- if (!headers.GetNormalizedHeader(
- data_reduction_proxy::chrome_proxy_content_transform_header(),
- &header_value)) {
- return false;
- }
- return IsPreviewTypeInHeaderValue(header_value, transform_type);
+ base::StringPiece transform_type) {
+ std::string value;
+ return headers.EnumerateHeader(nullptr, kChromeProxyContentTransformHeader,
+ &value) &&
+ IsPreviewTypeInHeaderValue(value, transform_type);
}
// Returns true if there is a cycle in |url_chain|.
@@ -158,12 +159,27 @@ const char* if_heavy_qualifier() {
}
bool IsEmptyImagePreview(const net::HttpResponseHeaders& headers) {
- return IsPreviewType(headers, kEmptyImageDirective);
+ return IsPreviewType(headers, kEmptyImageDirective) ||
+ headers.HasHeaderValue(kChromeProxyHeader,
+ kLegacyChromeProxyLoFiResponseDirective);
}
-bool IsEmptyImagePreview(const std::string& content_transform_value) {
- return IsPreviewTypeInHeaderValue(content_transform_value,
- kEmptyImageDirective);
+bool IsEmptyImagePreview(const std::string& content_transform_value,
+ const std::string& chrome_proxy_value) {
+ if (IsPreviewTypeInHeaderValue(content_transform_value, kEmptyImageDirective))
+ return true;
+
+ // Look for "q=low" in the "Chrome-Proxy" response header.
+ net::HttpUtil::ValuesIterator values(chrome_proxy_value.begin(),
+ chrome_proxy_value.end(), ',');
+ while (values.GetNext()) {
+ base::StringPiece value(values.value_begin(), values.value_end());
+ if (base::LowerCaseEqualsASCII(value,
+ kLegacyChromeProxyLoFiResponseDirective)) {
+ return true;
+ }
+ }
+ return false;
}
bool IsLitePagePreview(const net::HttpResponseHeaders& headers) {

Powered by Google App Engine
This is Rietveld 408576698