From da857beedca8e6657436abe88d375fcf0c3d847e Mon Sep 17 00:00:00 2001 From: tongrenaolong <3300763927@qq.com> Date: Sat, 5 Jul 2025 11:31:07 +0800 Subject: [PATCH 1/5] fix ZlibStream.h --- muduo/net/ZlibStream.h | 77 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 5 deletions(-) diff --git a/muduo/net/ZlibStream.h b/muduo/net/ZlibStream.h index 0f143b0c9..d3e756427 100644 --- a/muduo/net/ZlibStream.h +++ b/muduo/net/ZlibStream.h @@ -28,13 +28,80 @@ class ZlibInputStream : noncopyable finish(); } - bool write(StringPiece buf); - bool write(Buffer* input); - bool finish(); - // inflateEnd(&zstream_); + bool decompressToStdString(std::string& result) { + if (zerror_ != Z_OK && zerror_ != Z_STREAM_END) { + return false; + } + + void* in = const_cast(output_->peek()); + zstream_.next_in = static_cast(in); + zstream_.avail_in = static_cast(output_->readableBytes()); + + while (zstream_.avail_in > 0 && zerror_ == Z_OK) { + zerror_ = decompress(Z_NO_FLUSH); + } + if(zstream_.avail_in == 0){ + assert(static_cast(zstream_.next_in) == output_->beginWrite()); + zstream_.next_in = NULL; + } + return zerror_ == Z_OK; + } + + bool write(StringPiece buf) { + return false; + } + + bool write(Buffer* input) + { + printf("zerror_: %d, Z_OK: %d\n", zerror_,Z_OK ); + if (zerror_ != Z_OK) { + return false; + } + + zstream_.next_in = reinterpret_cast(const_cast(input->peek())); + zstream_.avail_in = static_cast(input->readableBytes()); + + while (zstream_.avail_in > 0 && zerror_ == Z_OK) { + output_->ensureWritableBytes(1024); + zstream_.next_out = reinterpret_cast(output_->beginWrite()); + zstream_.avail_out = static_cast(output_->writableBytes()); + zerror_ = decompress(Z_NO_FLUSH); + if (zerror_ == Z_OK || zerror_ == Z_STREAM_END) { + output_->hasWritten(zstream_.next_out - reinterpret_cast(output_->beginWrite())); + } + } + input->append(output_->peek(), output_->readableBytes()); + output_->retrieveAll(); + + input->retrieve(input->readableBytes() - zstream_.avail_in); + return zerror_ == Z_OK || zerror_ == Z_STREAM_END; + } + bool finish() + { + if (zerror_ != Z_OK) { + return false; + } + zerror_ = inflateEnd(&zstream_); + bool ok = zerror_ == Z_OK; + zerror_ = Z_STREAM_END; + return ok; + } private: - int decompress(int flush); + int decompress(int flush) + { + int buffer_size = 1024; + output_->ensureWritableBytes(buffer_size); + zstream_.next_out = reinterpret_cast(output_->beginWrite()); + zstream_.avail_out = static_cast(output_->writableBytes()); + int error = ::inflate(&zstream_, flush); + output_->hasWritten(output_->writableBytes() - zstream_.avail_out); + if (output_->writableBytes() == 0 && buffer_size < 65536) + { + buffer_size *= 2; + } + return error; + } Buffer* output_; z_stream zstream_; From 7ecb4f3c68aa23519c1189f6cd217b2f73dd8cdb Mon Sep 17 00:00:00 2001 From: tongrenaolong <3300763927@qq.com> Date: Sat, 5 Jul 2025 11:34:13 +0800 Subject: [PATCH 2/5] fix ZlibStream_unittest.cc --- muduo/net/tests/ZlibStream_unittest.cc | 53 ++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/muduo/net/tests/ZlibStream_unittest.cc b/muduo/net/tests/ZlibStream_unittest.cc index 144dda0ec..e3f7ac358 100644 --- a/muduo/net/tests/ZlibStream_unittest.cc +++ b/muduo/net/tests/ZlibStream_unittest.cc @@ -89,3 +89,56 @@ BOOST_AUTO_TEST_CASE(testZlibOutputStream5) printf("total %zd\n", output.readableBytes()); BOOST_CHECK_EQUAL(stream.zlibErrorCode(), Z_STREAM_END); } + + +BOOST_AUTO_TEST_CASE(testZlibInputStream) { + muduo::net::Buffer input; + muduo::net::Buffer output; + { + muduo::net::ZlibOutputStream outStream(&input); + outStream.write("Hello, Zlib!"); + outStream.finish(); + } + + muduo::net::ZlibInputStream inStream(&input); + std::string result; + while (inStream.zlibErrorCode() == Z_OK) { + muduo::net::Buffer temp; + if (inStream.read(&temp)) { + result.append(temp.peek(), temp.readableBytes()); + } + } + BOOST_CHECK_EQUAL(result, "Hello, Zlib!"); +} + +BOOST_AUTO_TEST_CASE(testZlibInputStreamEmpty) { + muduo::net::Buffer input; + muduo::net::ZlibInputStream inStream(&input); + muduo::net::Buffer output; + BOOST_CHECK(!inStream.read(&output)); + BOOST_CHECK_EQUAL(output.readableBytes(), 0); +} + +BOOST_AUTO_TEST_CASE(testZlibInputStreamLargeData) { + muduo::net::Buffer input; + std::string largeData; + for (int i = 0; i < 1000; ++i) { + largeData += "This is a test for large data compression and decompression. "; + } + + { + muduo::net::ZlibOutputStream outStream(&input); + outStream.write(largeData); + outStream.finish(); + } + + muduo::net::ZlibInputStream inStream(&input); + std::string result; + while (inStream.zlibErrorCode() == Z_OK) { + muduo::net::Buffer temp; + if (inStream.read(&temp)) { + result.append(temp.peek(), temp.readableBytes()); + } + } + BOOST_CHECK_EQUAL(result, largeData); +} From 5c9bc344df6a435616bb0e854f8178d7fc8c2eac Mon Sep 17 00:00:00 2001 From: tongrenaolong <3300763927@qq.com> Date: Sat, 5 Jul 2025 13:59:32 +0800 Subject: [PATCH 3/5] fix bug --- .gitignore | 2 + muduo/net/ZlibStream.h | 66 +++++++++++--------------- muduo/net/tests/ZlibStream_unittest.cc | 32 ++++++++----- 3 files changed, 50 insertions(+), 50 deletions(-) diff --git a/.gitignore b/.gitignore index 67e45bd1e..56a9e6edd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ *.swp bazel-* compile_commands.json +build +settings.json \ No newline at end of file diff --git a/muduo/net/ZlibStream.h b/muduo/net/ZlibStream.h index d3e756427..8ec8a34bc 100644 --- a/muduo/net/ZlibStream.h +++ b/muduo/net/ZlibStream.h @@ -4,6 +4,8 @@ #include "muduo/net/Buffer.h" #pragma GCC diagnostic ignored "-Wold-style-cast" #include +#include +using namespace std; namespace muduo { @@ -27,54 +29,44 @@ class ZlibInputStream : noncopyable { finish(); } + int zlibErrorCode() const { return zerror_; } + bool write(StringPiece buf) + { + if (zerror_ != Z_OK) + return false; - bool decompressToStdString(std::string& result) { - if (zerror_ != Z_OK && zerror_ != Z_STREAM_END) { - return false; - } - - void* in = const_cast(output_->peek()); - zstream_.next_in = static_cast(in); - zstream_.avail_in = static_cast(output_->readableBytes()); - - while (zstream_.avail_in > 0 && zerror_ == Z_OK) { - zerror_ = decompress(Z_NO_FLUSH); - } - if(zstream_.avail_in == 0){ - assert(static_cast(zstream_.next_in) == output_->beginWrite()); - zstream_.next_in = NULL; - } - return zerror_ == Z_OK; + assert(zstream_.next_in == NULL && zstream_.avail_in == 0); + void* in = const_cast(buf.data()); + zstream_.next_in = static_cast(in); + zstream_.avail_in = buf.size(); + while (zstream_.avail_in > 0 && zerror_ == Z_OK) + { + zerror_ = decompress(Z_NO_FLUSH); + } + if (zstream_.avail_in == 0) + { + assert(static_cast(zstream_.next_in) == buf.end()); + zstream_.next_in = NULL; + } + return zerror_ == Z_OK; } - bool write(StringPiece buf) { - return false; - } - + // compress input as much as possible, not guarantee consuming all data. bool write(Buffer* input) { - printf("zerror_: %d, Z_OK: %d\n", zerror_,Z_OK ); - if (zerror_ != Z_OK) { + if (zerror_ != Z_OK) return false; - } - zstream_.next_in = reinterpret_cast(const_cast(input->peek())); + void* in = const_cast(input->peek()); + zstream_.next_in = static_cast(in); zstream_.avail_in = static_cast(input->readableBytes()); - - while (zstream_.avail_in > 0 && zerror_ == Z_OK) { - output_->ensureWritableBytes(1024); - zstream_.next_out = reinterpret_cast(output_->beginWrite()); - zstream_.avail_out = static_cast(output_->writableBytes()); + if (zstream_.avail_in > 0 && zerror_ == Z_OK) + { zerror_ = decompress(Z_NO_FLUSH); - if (zerror_ == Z_OK || zerror_ == Z_STREAM_END) { - output_->hasWritten(zstream_.next_out - reinterpret_cast(output_->beginWrite())); - } } - input->append(output_->peek(), output_->readableBytes()); - output_->retrieveAll(); - input->retrieve(input->readableBytes() - zstream_.avail_in); - return zerror_ == Z_OK || zerror_ == Z_STREAM_END; + std::cout << zerror_ << std::endl; + return zerror_ == Z_OK; } bool finish() { diff --git a/muduo/net/tests/ZlibStream_unittest.cc b/muduo/net/tests/ZlibStream_unittest.cc index e3f7ac358..d38055b97 100644 --- a/muduo/net/tests/ZlibStream_unittest.cc +++ b/muduo/net/tests/ZlibStream_unittest.cc @@ -82,32 +82,38 @@ BOOST_AUTO_TEST_CASE(testZlibOutputStream5) { BOOST_CHECK(stream.write(input)); } - printf("bufsiz %d\n", stream.internalOutputBufferSize()); - LOG_INFO << "total_in " << stream.inputBytes(); - LOG_INFO << "total_out " << stream.outputBytes(); + // printf("bufsiz %d\n", stream.internalOutputBufferSize()); + // LOG_INFO << "total_in " << stream.inputBytes(); + // LOG_INFO << "total_out " << stream.outputBytes(); stream.finish(); - printf("total %zd\n", output.readableBytes()); + // printf("total %zd\n", output.readableBytes()); BOOST_CHECK_EQUAL(stream.zlibErrorCode(), Z_STREAM_END); } BOOST_AUTO_TEST_CASE(testZlibInputStream) { - muduo::net::Buffer input; - muduo::net::Buffer output; + muduo::net::Buffer input;// zlib_data + muduo::net::Buffer output;// data { muduo::net::ZlibOutputStream outStream(&input); outStream.write("Hello, Zlib!"); outStream.finish(); } - - muduo::net::ZlibInputStream inStream(&input); + muduo::net::ZlibInputStream inStream(&output); std::string result; + // inStream.write(&input); + // std::cout << "readableBytes: " << output.readableBytes() << std::endl; + // std::cout << output.peek() << std::endl; while (inStream.zlibErrorCode() == Z_OK) { - muduo::net::Buffer temp; - if (inStream.read(&temp)) { - result.append(temp.peek(), temp.readableBytes()); + puts("-----"); + std::cout << inStream.write(&input) << std::endl; + if (inStream.write(&input)) { + result.append(output.peek(), output.readableBytes()); } + std::cout << output.peek() << std::endl; + puts("-----"); } + std::cout << result << std::endl; BOOST_CHECK_EQUAL(result, "Hello, Zlib!"); } @@ -115,7 +121,7 @@ BOOST_AUTO_TEST_CASE(testZlibInputStreamEmpty) { muduo::net::Buffer input; muduo::net::ZlibInputStream inStream(&input); muduo::net::Buffer output; - BOOST_CHECK(!inStream.read(&output)); + BOOST_CHECK(!inStream.write(&output)); BOOST_CHECK_EQUAL(output.readableBytes(), 0); } @@ -136,7 +142,7 @@ BOOST_AUTO_TEST_CASE(testZlibInputStreamLargeData) { std::string result; while (inStream.zlibErrorCode() == Z_OK) { muduo::net::Buffer temp; - if (inStream.read(&temp)) { + if (inStream.write(&temp)) { result.append(temp.peek(), temp.readableBytes()); } } From d7860b5262c2b864aa3fedcde515556d2397ef7a Mon Sep 17 00:00:00 2001 From: tongrenaolong <3300763927@qq.com> Date: Sat, 5 Jul 2025 18:43:53 +0800 Subject: [PATCH 4/5] finish zlibstream --- muduo/net/ZlibStream.h | 23 ++++++++-------- muduo/net/tests/ZlibStream_unittest.cc | 36 ++++++++------------------ 2 files changed, 22 insertions(+), 37 deletions(-) diff --git a/muduo/net/ZlibStream.h b/muduo/net/ZlibStream.h index 8ec8a34bc..f5932a68a 100644 --- a/muduo/net/ZlibStream.h +++ b/muduo/net/ZlibStream.h @@ -32,7 +32,7 @@ class ZlibInputStream : noncopyable int zlibErrorCode() const { return zerror_; } bool write(StringPiece buf) { - if (zerror_ != Z_OK) + if (zerror_ != Z_OK && zerror_ != Z_STREAM_END) return false; assert(zstream_.next_in == NULL && zstream_.avail_in == 0); @@ -48,13 +48,13 @@ class ZlibInputStream : noncopyable assert(static_cast(zstream_.next_in) == buf.end()); zstream_.next_in = NULL; } - return zerror_ == Z_OK; + return zerror_ == Z_OK || zerror_ == Z_STREAM_END; } // compress input as much as possible, not guarantee consuming all data. bool write(Buffer* input) { - if (zerror_ != Z_OK) + if (zerror_ != Z_OK && zerror_ != Z_STREAM_END) return false; void* in = const_cast(input->peek()); @@ -65,16 +65,15 @@ class ZlibInputStream : noncopyable zerror_ = decompress(Z_NO_FLUSH); } input->retrieve(input->readableBytes() - zstream_.avail_in); - std::cout << zerror_ << std::endl; - return zerror_ == Z_OK; + return zerror_ == Z_OK || zerror_ == Z_STREAM_END; } bool finish() { - if (zerror_ != Z_OK) { + if (zerror_ != Z_OK && zerror_ != Z_STREAM_END) { return false; } zerror_ = inflateEnd(&zstream_); - bool ok = zerror_ == Z_OK; + bool ok = (zerror_ == Z_OK || zerror_ == Z_STREAM_END); zerror_ = Z_STREAM_END; return ok; } @@ -128,7 +127,7 @@ class ZlibOutputStream : noncopyable bool write(StringPiece buf) { - if (zerror_ != Z_OK) + if (zerror_ != Z_OK && zerror_ != Z_STREAM_END) return false; assert(zstream_.next_in == NULL && zstream_.avail_in == 0); @@ -144,13 +143,13 @@ class ZlibOutputStream : noncopyable assert(static_cast(zstream_.next_in) == buf.end()); zstream_.next_in = NULL; } - return zerror_ == Z_OK; + return zerror_ == Z_OK || zerror_ == Z_STREAM_END; } // compress input as much as possible, not guarantee consuming all data. bool write(Buffer* input) { - if (zerror_ != Z_OK) + if (zerror_ != Z_OK && zerror_ != Z_STREAM_END) return false; void* in = const_cast(input->peek()); @@ -161,12 +160,12 @@ class ZlibOutputStream : noncopyable zerror_ = compress(Z_NO_FLUSH); } input->retrieve(input->readableBytes() - zstream_.avail_in); - return zerror_ == Z_OK; + return zerror_ == Z_OK || zerror_ == Z_STREAM_END; } bool finish() { - if (zerror_ != Z_OK) + if (zerror_ != Z_OK && zerror_ != Z_STREAM_END) return false; while (zerror_ == Z_OK) diff --git a/muduo/net/tests/ZlibStream_unittest.cc b/muduo/net/tests/ZlibStream_unittest.cc index d38055b97..0a64623ab 100644 --- a/muduo/net/tests/ZlibStream_unittest.cc +++ b/muduo/net/tests/ZlibStream_unittest.cc @@ -82,11 +82,7 @@ BOOST_AUTO_TEST_CASE(testZlibOutputStream5) { BOOST_CHECK(stream.write(input)); } - // printf("bufsiz %d\n", stream.internalOutputBufferSize()); - // LOG_INFO << "total_in " << stream.inputBytes(); - // LOG_INFO << "total_out " << stream.outputBytes(); stream.finish(); - // printf("total %zd\n", output.readableBytes()); BOOST_CHECK_EQUAL(stream.zlibErrorCode(), Z_STREAM_END); } @@ -101,27 +97,18 @@ BOOST_AUTO_TEST_CASE(testZlibInputStream) { } muduo::net::ZlibInputStream inStream(&output); std::string result; - // inStream.write(&input); - // std::cout << "readableBytes: " << output.readableBytes() << std::endl; - // std::cout << output.peek() << std::endl; - while (inStream.zlibErrorCode() == Z_OK) { - puts("-----"); - std::cout << inStream.write(&input) << std::endl; - if (inStream.write(&input)) { - result.append(output.peek(), output.readableBytes()); - } - std::cout << output.peek() << std::endl; - puts("-----"); + while (input.readableBytes() > 0 && (inStream.zlibErrorCode() == Z_OK || inStream.zlibErrorCode() == Z_NEED_DICT)) { + BOOST_CHECK(inStream.write(&input)); } - std::cout << result << std::endl; - BOOST_CHECK_EQUAL(result, "Hello, Zlib!"); + inStream.finish(); + BOOST_CHECK_EQUAL(inStream.zlibErrorCode(), Z_STREAM_END); } BOOST_AUTO_TEST_CASE(testZlibInputStreamEmpty) { muduo::net::Buffer input; muduo::net::ZlibInputStream inStream(&input); muduo::net::Buffer output; - BOOST_CHECK(!inStream.write(&output)); + BOOST_CHECK(inStream.write(&output)); BOOST_CHECK_EQUAL(output.readableBytes(), 0); } @@ -138,13 +125,12 @@ BOOST_AUTO_TEST_CASE(testZlibInputStreamLargeData) { outStream.finish(); } - muduo::net::ZlibInputStream inStream(&input); + muduo::net::Buffer output; + muduo::net::ZlibInputStream inStream(&output); std::string result; - while (inStream.zlibErrorCode() == Z_OK) { - muduo::net::Buffer temp; - if (inStream.write(&temp)) { - result.append(temp.peek(), temp.readableBytes()); - } + while (input.readableBytes() > 0 && (inStream.zlibErrorCode() == Z_OK || inStream.zlibErrorCode() == Z_NEED_DICT)) { + BOOST_CHECK(inStream.write(&input)); } + result.append(output.peek(), output.readableBytes()); BOOST_CHECK_EQUAL(result, largeData); -} +} \ No newline at end of file From 11e46a50512a523179034144105c95d227a840ae Mon Sep 17 00:00:00 2001 From: tongrenaolong <3300763927@qq.com> Date: Sat, 5 Jul 2025 18:48:52 +0800 Subject: [PATCH 5/5] delete iostream from zlibstream.h --- muduo/net/ZlibStream.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/muduo/net/ZlibStream.h b/muduo/net/ZlibStream.h index f5932a68a..daa9d3a02 100644 --- a/muduo/net/ZlibStream.h +++ b/muduo/net/ZlibStream.h @@ -4,8 +4,6 @@ #include "muduo/net/Buffer.h" #pragma GCC diagnostic ignored "-Wold-style-cast" #include -#include -using namespace std; namespace muduo {