From 194f39241717cd5059e68bad385f28bcc98e278b Mon Sep 17 00:00:00 2001 From: yhirose Date: Fri, 16 Oct 2026 16:39:00 -0400 Subject: [PATCH] Treat a zero payload limit as none when decompressing a stream set_payload_max_length(0) means no limit, but StreamHandle compared the decompressed size against 0, so every compressed response read through the streaming API failed. --- httplib.h | 6 ++---- test/test.cc | 11 +++++++++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/httplib.h b/httplib.h index 57c674c7..ac094c8d 100644 --- a/httplib.h +++ b/httplib.h @@ -15598,10 +15598,8 @@ inline ssize_t ClientImpl::StreamHandle::read_with_decompression(char *buf, [this](const char *data, size_t data_len) { decompress_buffer_.append(data, data_len); auto limit = body_reader_.payload_max_length; - if (decompressed_bytes_read_ + decompress_buffer_.size() > limit) { - return false; - } - return true; + return limit == 0 || + decompressed_bytes_read_ + decompress_buffer_.size() <= limit; }); if (!decompress_ok) { diff --git a/test/test.cc b/test/test.cc index 35f78f59..f37f8e60 100644 --- a/test/test.cc +++ b/test/test.cc @@ -22411,6 +22411,17 @@ TEST_F(StreamApiTest, GetWithParams) { EXPECT_TRUE(read_body(result).find("foo=bar") != std::string::npos); } +#ifdef CPPHTTPLIB_ZLIB_SUPPORT +TEST_F(StreamApiTest, GetCompressedWithNoPayloadLimit) { + httplib::Client cli(HOST, PORT); + cli.set_payload_max_length(0); + auto result = httplib::stream::Get(cli, "/hello"); + ASSERT_TRUE(result.is_valid()); + EXPECT_FALSE(result.get_header_value("Content-Encoding").empty()); + EXPECT_EQ("Hello World!", read_body(result)); +} +#endif + TEST_F(StreamApiTest, GetConnectionError) { httplib::Client cli(HOST, 9999); EXPECT_FALSE(httplib::stream::Get(cli, "/hello").is_valid());