Nullus157 / async-compression

Adaptors between compression crates and Rust's async IO types

Home Page:https://docs.rs/async-compression

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

tokio Zlib Encoder doesn't work and maybe others as well

CfirTsabari opened this issue · comments

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"] }

You must e.shutdown().await in order to finish the stream and write the trailer.

ohh wow thanks,
sorry.