rust - 如何从 hyper::Response 中解压 XZ 数据?

标签 rust hyper xz

我正在使用 hyper 下载 XZ 文件,我想通过从每个传入的 Chunk 中尽可能多地提取,以解压缩的形式将其保存到磁盘。并将结果立即写入磁盘,而不是先下载整个文件然后解压缩。

xz2实现 XZ 格式的 crate 。然而,它的 XzDecoder似乎不支持 Python-like decompressobj模型,其中调用者重复提供部分输入并获得部分输出。

相反,XzDecoder 通过 Read 接收输入字节参数,我不确定如何将这两个东西粘合在一起。有没有办法喂一个ResponseXzDecoder?

到目前为止我找到的唯一线索是这个 issue ,其中包含对私有(private) ReadableChunks 的引用类型,理论上我可以在我的代码中复制它 - 但也许有更简单的方法?

最佳答案

XzDecoder does not seem to support a Python-like decompressobj model, where a caller repeatedly feeds partial input and gets partial output

xz2::stream::Stream这正是你想要的。非常粗糙的未经测试的代码,需要适当的错误处理等,但我希望你能明白:

fn process(body: hyper::body::Body) {
    let mut decoder = xz2::stream::Stream::new_stream_decoder(1000, 0).unwrap();
    body.for_each(|chunk| {
        let mut buf: Vec<u8> = Vec::new();
        if let Ok(_) = decoder.process_vec(&chunk, &mut buf, Action::Run) {
            // write buf to disk
        }
        Ok(())
    }).wait().unwrap();
}

关于rust - 如何从 hyper::Response 中解压 XZ 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54789749/

相关文章:

c# - 如何使用 sharpcompress 解压缩 .xz (lzma2) 文件

java - 使用 XZ Java for android 获取提取百分比

rust - Json<T> 是如何工作的(表单数据没有表单内容类型)

rust - 特征对象的 &mut 和 ref mut 之间的区别

rust - 使用 Rust,你如何在发布到 crate.io 之前执行平台测试?

rust - 如何设置 cargo build 的功能选项?

rust - super 客户端无法查找在 IPv6 本地主机上运行的服务器的地址信息

rust - 满足一个请求后如何终止 super 服务器?

linux - 使用 xz 而不是 gz - 非常慢

rust - 如何使用 hyper 下载大文件并在出错时恢复?