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

Unified Diff: net/http/http_network_transaction.cc

Issue 2753453003: Reject unadvertised encodings (Closed)
Patch Set: Extracted code for UMA reporting Created 3 years, 9 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: net/http/http_network_transaction.cc
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc
index a5395d758bcc4c9d26ef115ca43da28ce9424a0c..568da5fdcb59f482c833a5fc113bc084bd7c7355 100644
--- a/net/http/http_network_transaction.cc
+++ b/net/http/http_network_transaction.cc
@@ -32,6 +32,7 @@
#include "net/base/net_errors.h"
#include "net/base/upload_data_stream.h"
#include "net/base/url_util.h"
+#include "net/filter/filter_source_stream.h"
#include "net/http/http_auth.h"
#include "net/http/http_auth_handler.h"
#include "net/http/http_auth_handler_factory.h"
@@ -545,6 +546,13 @@ void HttpNetworkTransaction::OnNeedsProxyAuth(
establishing_tunnel_ = true;
response_.headers = proxy_response.headers;
response_.auth_challenge = proxy_response.auth_challenge;
+
+ if (response_.headers.get() && !ContentEncodingsValid()) {
+ FilterSourceStream::ReportContentDecodingFailed(SourceStream::TYPE_UNKNOWN);
+ DoCallback(ERR_CONTENT_DECODING_FAILED);
+ return;
+ }
+
headers_valid_ = true;
server_ssl_config_ = used_ssl_config;
proxy_info_ = used_proxy_info;
@@ -1246,6 +1254,11 @@ int HttpNetworkTransaction::DoReadHeadersComplete(int result) {
DCHECK(response_.headers.get());
+ if (response_.headers.get() && !ContentEncodingsValid()) {
+ FilterSourceStream::ReportContentDecodingFailed(SourceStream::TYPE_UNKNOWN);
+ return ERR_CONTENT_DECODING_FAILED;
+ }
+
// On a 408 response from the server ("Request Timeout") on a stale socket,
// retry the request.
// Headers can be NULL because of http://crbug.com/384554.
@@ -1711,4 +1724,28 @@ void HttpNetworkTransaction::CopyConnectionAttemptsFromStreamRequest() {
connection_attempts_.push_back(attempt);
}
+bool HttpNetworkTransaction::ContentEncodingsValid() const {
+ HttpResponseHeaders* headers = GetResponseHeaders();
+ DCHECK(headers);
+
+ std::string accept_encoding;
+ request_headers_.GetHeader(HttpRequestHeaders::kAcceptEncoding,
+ &accept_encoding);
+ std::set<std::string> allowed_encodings;
+ if (!HttpUtil::ParseAcceptEncoding(accept_encoding, &allowed_encodings))
Randy Smith (Not in Mondays) 2017/03/21 21:23:20 Does this code handle the case where neither heade
eustas 2017/03/27 10:27:11 Added augmentation in parser: "" -> {"*"}. Now ast
+ return false;
+
+ std::string content_encoding;
+ headers->GetNormalizedHeader("Content-Encoding", &content_encoding);
+ std::set<std::string> used_encodings;
+ if (!HttpUtil::ParseContentEncoding(content_encoding, &used_encodings))
+ return false;
+
+ for (auto const& encoding : used_encodings) {
Randy Smith (Not in Mondays) 2017/03/21 21:23:20 This doesn't appear to handle "Accept-Encoding: *"
eustas 2017/03/27 10:27:11 Fixed.
+ if (allowed_encodings.find(encoding) == allowed_encodings.end())
+ return false;
+ }
+ return true;
+}
+
} // namespace net

Powered by Google App Engine
This is Rietveld 408576698