tokio Zlib Encoder doesn't work and maybe others as well
CfirTsabari opened this issue · comments
CfirTsabari commented
using tokio:write:::ZlibEncoder doesn't result in a valid zlib data.
i made sure by using python and flate2
crate
here is a sample code:
use async_compression::tokio_02::write::ZlibEncoder;
use flate2::write::ZlibEncoder as Flate2ZlibEncoder;
use flate2::Compression;
use std::io::Write;
use tokio::io::AsyncWrite;
use tokio::io::AsyncWriteExt;
#[tokio::main]
async fn main() {
let x = b"example";
let mut e = ZlibEncoder::new(Vec::new());
e.write_all(x).await.unwrap();
e.flush().await.unwrap();
let temp = e.into_inner();
println!("{:?}", temp);
// [120, 156, 74, 173, 72, 204, 45, 200, 73, 5, 0, 0, 0, 255, 255]
// import zlib; print(zlib.decompress(bytes([120, 156, 74, 173, 72, 204, 45, 200, 73, 5, 0, 0, 0, 255, 255])))
// fail with:
// Traceback (most recent call last):
// File "test.py", line 25, in <module>
// print(zlib.decompress(bytes([120, 156, 74, 173, 72, 204, 45, 200, 73, 5, 0, 0, 0, 255, 255])))
// zlib.error: Error -5 while decompressing data: incomplete or truncated stream
// Working code with flate2
let mut encoder = Flate2ZlibEncoder::new(Vec::new(), Compression::Default);
encoder.write_all(x).unwrap();
encoder.flush().unwrap();
let temp = encoder.finish().unwrap();
println!("{:?}", temp);
// [120, 1, 0, 7, 0, 248, 255, 101, 120, 97, 109, 112, 108, 101, 0, 0, 0, 255, 255, 3, 0, 11, 192, 2, 237]
// import zlib; print(zlib.decompress(bytes([120, 1, 0, 7, 0, 248, 255, 101, 120, 97, 109, 112, 108, 101, 0, 0, 0, 255, 255, 3, 0, 11, 192, 2, 237])))
// prints b'example`
}
my deps:
[dependencies]
tokio = { version = "0.2", features = ["full"] }
flate2 = { version = "0.2", features = ["tokio"] }
async-compression = { version = "0.3.5", features = ["tokio-02","deflate","stream","zlib"] }
Nemo157 commented
You must e.shutdown().await
in order to finish the stream and write the trailer.
CfirTsabari commented
ohh wow thanks,
sorry.