0

Deprecate SDCH-related net::SourceStream types

- Deprecated three SDCH-related net::SourceStream types
- Modify URLRequestHttpJob::SetUpSourceStream() to not include default case

Bug: 764434, 764433, 762686
Change-Id: I93320bfee930484da76a0a29fab2224f2b886523
Reviewed-on: https://chromium-review.googlesource.com/667731
Commit-Queue: Helen Li <xunjieli@chromium.org>
Reviewed-by: Randy Smith <rdsmith@chromium.org>
Cr-Commit-Position: refs/heads/master@{#502337}
This commit is contained in:
Helen Li
2017-09-15 19:57:05 +00:00
committed by Commit Bot
parent 5753580510
commit 666c068451
8 changed files with 21 additions and 79 deletions

@@ -19,7 +19,6 @@ namespace {
const char kDeflate[] = "deflate"; const char kDeflate[] = "deflate";
const char kGZip[] = "gzip"; const char kGZip[] = "gzip";
const char kSdch[] = "sdch";
const char kXGZip[] = "x-gzip"; const char kXGZip[] = "x-gzip";
const char kBrotli[] = "br"; const char kBrotli[] = "br";
@@ -84,8 +83,6 @@ FilterSourceStream::SourceType FilterSourceStream::ParseEncodingType(
} else if (base::LowerCaseEqualsASCII(encoding, kGZip) || } else if (base::LowerCaseEqualsASCII(encoding, kGZip) ||
base::LowerCaseEqualsASCII(encoding, kXGZip)) { base::LowerCaseEqualsASCII(encoding, kXGZip)) {
return TYPE_GZIP; return TYPE_GZIP;
} else if (base::LowerCaseEqualsASCII(encoding, kSdch)) {
return TYPE_SDCH;
} else { } else {
return TYPE_UNKNOWN; return TYPE_UNKNOWN;
} }

@@ -20,7 +20,6 @@ namespace {
const char kDeflate[] = "DEFLATE"; const char kDeflate[] = "DEFLATE";
const char kGzip[] = "GZIP"; const char kGzip[] = "GZIP";
const char kGzipFallback[] = "GZIP_FALLBACK";
// For deflate streams, if more than this many bytes have been received without // For deflate streams, if more than this many bytes have been received without
// an error and without adding a Zlib header, assume the original stream had a // an error and without adding a Zlib header, assume the original stream had a
@@ -40,6 +39,7 @@ GzipSourceStream::~GzipSourceStream() {
std::unique_ptr<GzipSourceStream> GzipSourceStream::Create( std::unique_ptr<GzipSourceStream> GzipSourceStream::Create(
std::unique_ptr<SourceStream> upstream, std::unique_ptr<SourceStream> upstream,
SourceStream::SourceType type) { SourceStream::SourceType type) {
DCHECK(type == TYPE_GZIP || type == TYPE_DEFLATE);
std::unique_ptr<GzipSourceStream> source( std::unique_ptr<GzipSourceStream> source(
new GzipSourceStream(std::move(upstream), type)); new GzipSourceStream(std::move(upstream), type));
@@ -62,7 +62,7 @@ bool GzipSourceStream::Init() {
memset(zlib_stream_.get(), 0, sizeof(z_stream)); memset(zlib_stream_.get(), 0, sizeof(z_stream));
int ret; int ret;
if (type() == TYPE_GZIP || type() == TYPE_GZIP_FALLBACK) { if (type() == TYPE_GZIP) {
ret = inflateInit2(zlib_stream_.get(), -MAX_WBITS); ret = inflateInit2(zlib_stream_.get(), -MAX_WBITS);
} else { } else {
ret = inflateInit(zlib_stream_.get()); ret = inflateInit(zlib_stream_.get());
@@ -75,8 +75,6 @@ std::string GzipSourceStream::GetTypeAsString() const {
switch (type()) { switch (type()) {
case TYPE_GZIP: case TYPE_GZIP:
return kGzip; return kGzip;
case TYPE_GZIP_FALLBACK:
return kGzipFallback;
case TYPE_DEFLATE: case TYPE_DEFLATE:
return kDeflate; return kDeflate;
default: default:
@@ -104,14 +102,8 @@ int GzipSourceStream::FilterData(IOBuffer* output_buffer,
input_state_ = STATE_SNIFFING_DEFLATE_HEADER; input_state_ = STATE_SNIFFING_DEFLATE_HEADER;
break; break;
} }
// If this stream is not really gzipped as detected by
// ShouldFallbackToPlain, pretend that the zlib stream has ended.
DCHECK_LT(0, input_data_size); DCHECK_LT(0, input_data_size);
if (ShouldFallbackToPlain(input_data[0])) { input_state_ = STATE_GZIP_HEADER;
input_state_ = STATE_UNCOMPRESSED_BODY;
} else {
input_state_ = STATE_GZIP_HEADER;
}
break; break;
} }
case STATE_GZIP_HEADER: { case STATE_GZIP_HEADER: {
@@ -276,14 +268,4 @@ bool GzipSourceStream::InsertZlibHeader() {
return ret == Z_OK; return ret == Z_OK;
} }
// Dumb heuristic. Gzip files always start with a two-byte magic value per RFC
// 1952 2.3.1, so if the first byte isn't the first byte of the gzip magic, and
// this filter is checking whether it should fallback, then fallback.
bool GzipSourceStream::ShouldFallbackToPlain(char first_byte) {
if (type() != TYPE_GZIP_FALLBACK)
return false;
static const char kGzipFirstByte = 0x1f;
return first_byte != kGzipFirstByte;
}
} // namespace net } // namespace net

@@ -82,11 +82,6 @@ class NET_EXPORT_PRIVATE GzipSourceStream : public FilterSourceStream {
// success. // success.
bool InsertZlibHeader(); bool InsertZlibHeader();
// Returns whether this stream looks like it could be plain text (ie, not
// actually gzipped). Right now this uses an extremely simple heuristic; see
// the source for details. This method checks the first byte of the stream.
bool ShouldFallbackToPlain(char first_byte);
// The control block of zlib which actually does the decoding. // The control block of zlib which actually does the decoding.
// This data structure is initialized by Init and updated only by // This data structure is initialized by Init and updated only by
// FilterData(), with InsertZlibHeader() being the exception as a workaround. // FilterData(), with InsertZlibHeader() being the exception as a workaround.

@@ -21,8 +21,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
new net::FuzzedSourceStream(&data_provider)); new net::FuzzedSourceStream(&data_provider));
const net::SourceStream::SourceType kGzipTypes[] = { const net::SourceStream::SourceType kGzipTypes[] = {
net::SourceStream::TYPE_GZIP, net::SourceStream::TYPE_DEFLATE, net::SourceStream::TYPE_GZIP, net::SourceStream::TYPE_DEFLATE};
net::SourceStream::TYPE_GZIP_FALLBACK};
net::SourceStream::SourceType type = net::SourceStream::SourceType type =
data_provider.PickValueInArray(kGzipTypes); data_provider.PickValueInArray(kGzipTypes);
std::unique_ptr<net::GzipSourceStream> gzip_stream = std::unique_ptr<net::GzipSourceStream> gzip_stream =

@@ -60,11 +60,10 @@ class GzipSourceStreamTest : public ::testing::TestWithParam<GzipTestParam> {
GzipSourceStreamTest() : output_buffer_size_(GetParam().buffer_size) {} GzipSourceStreamTest() : output_buffer_size_(GetParam().buffer_size) {}
// Helpful function to initialize the test fixture.|type| specifies which type // Helpful function to initialize the test fixture.|type| specifies which type
// of GzipSourceStream to create. It must be one of TYPE_GZIP, // of GzipSourceStream to create. It must be one of TYPE_GZIP and
// TYPE_GZIP_FALLBACK and TYPE_DEFLATE. // TYPE_DEFLATE.
void Init(SourceStream::SourceType type) { void Init(SourceStream::SourceType type) {
EXPECT_TRUE(SourceStream::TYPE_GZIP == type || EXPECT_TRUE(SourceStream::TYPE_GZIP == type ||
SourceStream::TYPE_GZIP_FALLBACK == type ||
SourceStream::TYPE_DEFLATE == type); SourceStream::TYPE_DEFLATE == type);
source_data_len_ = kBigBufferSize - kEOFMargin; source_data_len_ = kBigBufferSize - kEOFMargin;
@@ -272,19 +271,6 @@ TEST_P(GzipSourceStreamTest, CorruptGzipHeader) {
EXPECT_EQ("GZIP", stream()->Description()); EXPECT_EQ("GZIP", stream()->Description());
} }
TEST_P(GzipSourceStreamTest, GzipFallback) {
Init(SourceStream::TYPE_GZIP_FALLBACK);
source()->AddReadResult(source_data(), source_data_len(), OK,
GetParam().mode);
source()->AddReadResult(nullptr, 0, OK, GetParam().mode);
std::string actual_output;
int rv = ReadStream(&actual_output);
EXPECT_EQ(static_cast<int>(source_data_len()), rv);
EXPECT_EQ(std::string(source_data(), source_data_len()), actual_output);
EXPECT_EQ("GZIP_FALLBACK", stream()->Description());
}
// This test checks that the gzip stream source works correctly on 'golden' data // This test checks that the gzip stream source works correctly on 'golden' data
// as produced by gzip(1). // as produced by gzip(1).
TEST_P(GzipSourceStreamTest, GzipCorrectness) { TEST_P(GzipSourceStreamTest, GzipCorrectness) {

@@ -7,9 +7,9 @@
SOURCE_STREAM_TYPE(BROTLI) SOURCE_STREAM_TYPE(BROTLI)
SOURCE_STREAM_TYPE(DEFLATE) SOURCE_STREAM_TYPE(DEFLATE)
SOURCE_STREAM_TYPE(GZIP) SOURCE_STREAM_TYPE(GZIP)
SOURCE_STREAM_TYPE(GZIP_FALLBACK) SOURCE_STREAM_TYPE(GZIP_FALLBACK_DEPRECATED)
SOURCE_STREAM_TYPE(SDCH) SOURCE_STREAM_TYPE(SDCH_DEPRECATED)
SOURCE_STREAM_TYPE(SDCH_POSSIBLE) SOURCE_STREAM_TYPE(SDCH_POSSIBLE_DEPRECATED)
SOURCE_STREAM_TYPE(INVALID) SOURCE_STREAM_TYPE(INVALID)
SOURCE_STREAM_TYPE(NONE) SOURCE_STREAM_TYPE(NONE)
SOURCE_STREAM_TYPE(REJECTED) SOURCE_STREAM_TYPE(REJECTED)

@@ -1013,15 +1013,21 @@ std::unique_ptr<SourceStream> URLRequestHttpJob::SetUpSourceStream() {
case SourceStream::TYPE_NONE: case SourceStream::TYPE_NONE:
// Identity encoding type. Pass through raw response body. // Identity encoding type. Pass through raw response body.
return upstream; return upstream;
case SourceStream::TYPE_SDCH: case SourceStream::TYPE_UNKNOWN:
// Pass through raw sdch response.
default:
// Unknown encoding type. Pass through raw response body. // Unknown encoding type. Pass through raw response body.
// Despite of reporting to UMA, request will not be canceled; though // Despite of reporting to UMA, request will not be canceled; though
// it is expected that user will see malformed / garbage response. // it is expected that user will see malformed / garbage response.
FilterSourceStream::ReportContentDecodingFailed( FilterSourceStream::ReportContentDecodingFailed(
FilterSourceStream::TYPE_UNKNOWN); FilterSourceStream::TYPE_UNKNOWN);
return upstream; return upstream;
case SourceStream::TYPE_GZIP_FALLBACK_DEPRECATED:
case SourceStream::TYPE_SDCH_DEPRECATED:
case SourceStream::TYPE_SDCH_POSSIBLE_DEPRECATED:
case SourceStream::TYPE_REJECTED:
case SourceStream::TYPE_INVALID:
case SourceStream::TYPE_MAX:
NOTREACHED();
return nullptr;
} }
} }
@@ -1036,11 +1042,11 @@ std::unique_ptr<SourceStream> URLRequestHttpJob::SetUpSourceStream() {
break; break;
case SourceStream::TYPE_GZIP: case SourceStream::TYPE_GZIP:
case SourceStream::TYPE_DEFLATE: case SourceStream::TYPE_DEFLATE:
case SourceStream::TYPE_GZIP_FALLBACK:
downstream = GzipSourceStream::Create(std::move(upstream), type); downstream = GzipSourceStream::Create(std::move(upstream), type);
break; break;
case SourceStream::TYPE_SDCH: case SourceStream::TYPE_GZIP_FALLBACK_DEPRECATED:
case SourceStream::TYPE_SDCH_POSSIBLE: case SourceStream::TYPE_SDCH_DEPRECATED:
case SourceStream::TYPE_SDCH_POSSIBLE_DEPRECATED:
case SourceStream::TYPE_NONE: case SourceStream::TYPE_NONE:
case SourceStream::TYPE_INVALID: case SourceStream::TYPE_INVALID:
case SourceStream::TYPE_REJECTED: case SourceStream::TYPE_REJECTED:

@@ -178,29 +178,6 @@ TEST_F(URLRequestHttpJobSetUpSourceTest, UnknownEncoding) {
EXPECT_EQ("Test Content", delegate_.data_received()); EXPECT_EQ("Test Content", delegate_.data_received());
} }
// Received a SDCH encoded response when Sdch is not advertised.
TEST_F(URLRequestHttpJobSetUpSourceTest, SdchNotAdvertisedGotSdchResponse) {
MockWrite writes[] = {MockWrite(kSimpleGetMockWrite)};
MockRead reads[] = {MockRead("HTTP/1.1 200 OK\r\n"
"Content-Encoding: sdch\r\n"
"Content-Length: 12\r\n\r\n"),
MockRead("Test Content")};
StaticSocketDataProvider socket_data(reads, arraysize(reads), writes,
arraysize(writes));
socket_factory_.AddSocketDataProvider(&socket_data);
std::unique_ptr<URLRequest> request =
context_.CreateRequest(GURL("http://www.example.com"), DEFAULT_PRIORITY,
&delegate_, TRAFFIC_ANNOTATION_FOR_TESTS);
auto job = std::make_unique<TestURLRequestHttpJob>(request.get());
test_job_interceptor_->set_main_intercept_job(std::move(job));
request->Start();
base::RunLoop().Run();
EXPECT_EQ(ERR_CONTENT_DECODING_FAILED, delegate_.request_status());
}
class URLRequestHttpJobTest : public ::testing::Test { class URLRequestHttpJobTest : public ::testing::Test {
protected: protected:
URLRequestHttpJobTest() : context_(true) { URLRequestHttpJobTest() : context_(true) {