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 b3053b24325a37a5a659adab66e0f56c65c0cc92..4db9ec146350df6f80b69e37a176eeb03afc6523 100644 |
--- a/net/url_request/url_request_http_job.cc |
+++ b/net/url_request/url_request_http_job.cc |
@@ -76,12 +76,6 @@ static const char kAvailDictionaryHeader[] = "Avail-Dictionary"; |
namespace { |
-const char kDeflate[] = "deflate"; |
-const char kGZip[] = "gzip"; |
-const char kSdch[] = "sdch"; |
-const char kXGZip[] = "x-gzip"; |
-const char kBrotli[] = "br"; |
- |
// True if the request method is "safe" (per section 4.2.1 of RFC 7231). |
bool IsMethodSafe(const std::string& method) { |
return method == "GET" || method == "HEAD" || method == "OPTIONS" || |
@@ -1064,22 +1058,31 @@ std::unique_ptr<SourceStream> URLRequestHttpJob::SetUpSourceStream() { |
std::vector<SourceStream::SourceType> types; |
size_t iter = 0; |
while (headers->EnumerateHeader(&iter, "Content-Encoding", &type)) { |
- if (base::LowerCaseEqualsASCII(type, kBrotli)) { |
- types.push_back(SourceStream::TYPE_BROTLI); |
- } else if (base::LowerCaseEqualsASCII(type, kDeflate)) { |
- types.push_back(SourceStream::TYPE_DEFLATE); |
- } else if (base::LowerCaseEqualsASCII(type, kGZip) || |
- base::LowerCaseEqualsASCII(type, kXGZip)) { |
- types.push_back(SourceStream::TYPE_GZIP); |
- } else if (base::LowerCaseEqualsASCII(type, kSdch)) { |
+ SourceStream::SourceType source_type = |
+ FilterSourceStream::ParseEncodingType(type); |
+ if (source_type == SourceStream::TYPE_SDCH && |
+ !request()->context()->sdch_manager()) { |
// If SDCH support is not configured, pass through raw response. |
- if (!request()->context()->sdch_manager()) |
- return upstream; |
- types.push_back(SourceStream::TYPE_SDCH); |
- } else { |
- // Unknown encoding type. Pass through raw response body. |
return upstream; |
} |
+ switch (source_type) { |
+ case SourceStream::TYPE_BROTLI: |
+ case SourceStream::TYPE_DEFLATE: |
+ case SourceStream::TYPE_GZIP: |
+ case SourceStream::TYPE_SDCH: |
+ types.push_back(source_type); |
+ break; |
+ case SourceStream::TYPE_NONE: |
+ // Identity encoding type. Pass through raw response body. |
+ return upstream; |
+ default: |
+ // Unknown encoding type. Pass through raw response body. |
+ // Despite of reporting to UMA, request will not be canceled; though |
+ // it is expected that user will see malformed / garbage response. |
+ FilterSourceStream::ReportContentDecodingFailed( |
+ FilterSourceStream::TYPE_UNKNOWN); |
+ return upstream; |
+ } |
} |
// Sdch specific hacks: |
@@ -1119,6 +1122,8 @@ std::unique_ptr<SourceStream> URLRequestHttpJob::SetUpSourceStream() { |
break; |
case SourceStream::TYPE_NONE: |
case SourceStream::TYPE_INVALID: |
+ case SourceStream::TYPE_REJECTED: |
+ case SourceStream::TYPE_UNKNOWN: |
case SourceStream::TYPE_MAX: |
NOTREACHED(); |
return nullptr; |