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:
@@ -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) {
|
||||||
|
Reference in New Issue
Block a user