Honor set_decompress(false) in response streams (#2640)

open_stream_() created a decoder whatever set_decompress() said, so a response stream decoded the body when decompression was disabled, and failed with UnsupportedContentEncoding in a build without that decoder. The buffered path already checks the option; the streaming path now does too. The new test covers open_stream() and stream::Get().

Fixes #2639.
This commit is contained in:
Luochenchen authored and GitHub committed 2026-10-25 20:05:56 -04:00
1 parent d23d1b6029
commit 76f84a5bfd
2 files changed
+32 -1

No files matched your search

+31
View File
@@ -23779,6 +23779,37 @@ static void with_single_response(const std::string &response, Fn fn) {
fn(cli);
}
// set_decompress(false) hands out the encoded bytes through the streaming APIs
// too, also in a build without the decoder for the advertised coding.
TEST(StreamDecompressionTest, DisabledPreservesEncodedBody) {
const std::string gzipped(GZIPPED_HELLO_WORLD, sizeof(GZIPPED_HELLO_WORLD));
const auto response = "HTTP/1.1 200 OK\r\n"
"Content-Encoding: gzip\r\n"
"Content-Length: " +
std::to_string(gzipped.size()) +
"\r\n"
"Connection: close\r\n\r\n" +
gzipped;
with_single_response(response, [&](Client &cli) {
cli.set_decompress(false);
auto handle = cli.open_stream("GET", "/");
ASSERT_TRUE(handle.is_valid()) << to_string(handle.error);
EXPECT_EQ("gzip", handle.response->get_header_value("Content-Encoding"));
EXPECT_EQ(gzipped, read_all(handle));
EXPECT_FALSE(handle.has_read_error());
});
with_single_response(response, [&](Client &cli) {
cli.set_decompress(false);
auto res = stream::Get(cli, "/", 7);
ASSERT_TRUE(res) << to_string(res.error());
EXPECT_EQ("gzip", res.get_header_value("Content-Encoding"));
EXPECT_EQ(gzipped, res.read_all());
EXPECT_FALSE(res.has_read_error());
});
}
TEST(StreamBodyEndTest, BodyEndingAtConnectionClose) {
// Neither Content-Length nor chunked: the body ends at the close
const char *close_delimited = "HTTP/1.1 200 OK\r\n"