diff --git a/crates/compression-codecs/src/gzip/decoder.rs b/crates/compression-codecs/src/gzip/decoder.rs
index 647959c..44064b0 100644
--- a/crates/compression-codecs/src/gzip/decoder.rs
+++ b/crates/compression-codecs/src/gzip/decoder.rs
@@ -64,7 +64,8 @@ impl GzipDecoder {
loop {
match &mut self.state {
State::Header(parser) => {
- if parser.input(input)?.is_some() {
+ if parser.input(&mut self.crc, input)?.is_some() {
+ self.crc.reset();
self.state = State::Decoding;
}
}
diff --git a/crates/compression-codecs/src/gzip/header.rs b/crates/compression-codecs/src/gzip/header.rs
index 9c894e9..f28231b 100644
--- a/crates/compression-codecs/src/gzip/header.rs
+++ b/crates/compression-codecs/src/gzip/header.rs
@@ -1,4 +1,5 @@
use compression_core::util::PartialBuffer;
+use flate2::Crc;
use std::io;
#[derive(Debug, Default)]
@@ -61,18 +62,39 @@ impl Header {
}
}
+fn consume_input(crc: &mut Crc, n: usize, input: &mut PartialBuffer<&[u8]>) {
+ crc.update(&input.unwritten()[..n]);
+ input.advance(n);
+}
+
+fn consume_cstr(crc: &mut Crc, input: &mut PartialBuffer<&[u8]>) -> Option<()> {
+ if let Some(len) = memchr::memchr(0, input.unwritten()) {
+ consume_input(crc, len + 1, input);
+ Some(())
+ } else {
+ consume_input(crc, input.unwritten().len(), input);
+ None
+ }
+}
+
impl Parser {
- pub(super) fn input(&mut self, input: &mut PartialBuffer<&[u8]>) -> io::Result