chore: use streaming in deflate64 crate
This commit is contained in:
parent
065058d30d
commit
70c0b164be
4 changed files with 4 additions and 67 deletions
|
@ -23,7 +23,7 @@ pbkdf2 = {version = "0.11.0", optional = true }
|
||||||
sha1 = {version = "0.10.1", optional = true }
|
sha1 = {version = "0.10.1", optional = true }
|
||||||
time = { version = "0.3.7", optional = true, default-features = false, features = ["std"] }
|
time = { version = "0.3.7", optional = true, default-features = false, features = ["std"] }
|
||||||
zstd = { version = "0.11.2", optional = true }
|
zstd = { version = "0.11.2", optional = true }
|
||||||
deflate64 = { version = "0.1.3", optional = true }
|
deflate64 = { version = "0.1.4", optional = true }
|
||||||
|
|
||||||
[target.'cfg(any(all(target_arch = "arm", target_pointer_width = "32"), target_arch = "mips", target_arch = "powerpc"))'.dependencies]
|
[target.'cfg(any(all(target_arch = "arm", target_pointer_width = "32"), target_arch = "mips", target_arch = "powerpc"))'.dependencies]
|
||||||
crossbeam-utils = "0.8.8"
|
crossbeam-utils = "0.8.8"
|
||||||
|
|
|
@ -1,61 +0,0 @@
|
||||||
// TODO: move this module to deflate64 crate
|
|
||||||
|
|
||||||
use deflate64::InflaterManaged;
|
|
||||||
use std::io;
|
|
||||||
use std::io::{BufRead, BufReader, Read};
|
|
||||||
|
|
||||||
const IN_BUFFER_MAX_SIZE: usize = 8192;
|
|
||||||
|
|
||||||
pub(crate) struct BufferedDeflate64Decoder<R> {
|
|
||||||
inner: R,
|
|
||||||
inflator: Box<InflaterManaged>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<R: Read> BufferedDeflate64Decoder<BufReader<R>> {
|
|
||||||
pub(crate) fn new(inner: R) -> Self {
|
|
||||||
Self {
|
|
||||||
inner: BufReader::new(inner),
|
|
||||||
inflator: Box::new(InflaterManaged::new()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<R> BufferedDeflate64Decoder<R> {
|
|
||||||
pub(crate) fn into_inner(self) -> R {
|
|
||||||
self.inner
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct State {
|
|
||||||
inflater: InflaterManaged,
|
|
||||||
in_buffer_size: u16,
|
|
||||||
in_buffer: [u8; IN_BUFFER_MAX_SIZE],
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<R: BufRead> Read for BufferedDeflate64Decoder<R> {
|
|
||||||
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
|
|
||||||
loop {
|
|
||||||
let input = self.inner.fill_buf()?;
|
|
||||||
let eof = input.is_empty();
|
|
||||||
|
|
||||||
let result = self.inflator.inflate(input, buf);
|
|
||||||
|
|
||||||
self.inner.consume(result.bytes_consumed);
|
|
||||||
|
|
||||||
if result.data_error {
|
|
||||||
return Err(io::Error::new(
|
|
||||||
io::ErrorKind::InvalidInput,
|
|
||||||
"invalid deflate64",
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
if result.bytes_written == 0 && !eof && !self.inflator.finished() {
|
|
||||||
// if we haven't ready any data and we haven't hit EOF yet,
|
|
||||||
// ask again. We must not return 0 in such case
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(result.bytes_written)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -36,8 +36,6 @@ mod aes_ctr;
|
||||||
mod compression;
|
mod compression;
|
||||||
mod cp437;
|
mod cp437;
|
||||||
mod crc32;
|
mod crc32;
|
||||||
#[cfg(feature = "deflate64")]
|
|
||||||
mod deflate64;
|
|
||||||
pub mod read;
|
pub mod read;
|
||||||
pub mod result;
|
pub mod result;
|
||||||
mod spec;
|
mod spec;
|
||||||
|
|
|
@ -24,7 +24,7 @@ use std::sync::Arc;
|
||||||
use flate2::read::DeflateDecoder;
|
use flate2::read::DeflateDecoder;
|
||||||
|
|
||||||
#[cfg(feature = "deflate64")]
|
#[cfg(feature = "deflate64")]
|
||||||
use crate::deflate64::BufferedDeflate64Decoder;
|
use deflate64::Deflate64Decoder;
|
||||||
|
|
||||||
#[cfg(feature = "bzip2")]
|
#[cfg(feature = "bzip2")]
|
||||||
use bzip2::read::BzDecoder;
|
use bzip2::read::BzDecoder;
|
||||||
|
@ -133,7 +133,7 @@ enum ZipFileReader<'a> {
|
||||||
))]
|
))]
|
||||||
Deflated(Crc32Reader<flate2::read::DeflateDecoder<CryptoReader<'a>>>),
|
Deflated(Crc32Reader<flate2::read::DeflateDecoder<CryptoReader<'a>>>),
|
||||||
#[cfg(feature = "deflate64")]
|
#[cfg(feature = "deflate64")]
|
||||||
Deflate64(Crc32Reader<BufferedDeflate64Decoder<io::BufReader<CryptoReader<'a>>>>),
|
Deflate64(Crc32Reader<Deflate64Decoder<io::BufReader<CryptoReader<'a>>>>),
|
||||||
#[cfg(feature = "bzip2")]
|
#[cfg(feature = "bzip2")]
|
||||||
Bzip2(Crc32Reader<BzDecoder<CryptoReader<'a>>>),
|
Bzip2(Crc32Reader<BzDecoder<CryptoReader<'a>>>),
|
||||||
#[cfg(feature = "zstd")]
|
#[cfg(feature = "zstd")]
|
||||||
|
@ -288,7 +288,7 @@ fn make_reader(
|
||||||
}
|
}
|
||||||
#[cfg(feature = "deflate64")]
|
#[cfg(feature = "deflate64")]
|
||||||
CompressionMethod::Deflate64 => {
|
CompressionMethod::Deflate64 => {
|
||||||
let deflate64_reader = BufferedDeflate64Decoder::new(reader);
|
let deflate64_reader = Deflate64Decoder::new(reader);
|
||||||
ZipFileReader::Deflate64(Crc32Reader::new(deflate64_reader, crc32, ae2_encrypted))
|
ZipFileReader::Deflate64(Crc32Reader::new(deflate64_reader, crc32, ae2_encrypted))
|
||||||
}
|
}
|
||||||
#[cfg(feature = "bzip2")]
|
#[cfg(feature = "bzip2")]
|
||||||
|
|
Loading…
Add table
Reference in a new issue