From 85acf717764cb0e5ab30043b0ea3cb13164baa78 Mon Sep 17 00:00:00 2001 From: Takeru Ohta Date: Sun, 21 May 2023 10:54:18 +0900 Subject: [PATCH] Add `unread_decoded_data` methods to decoders --- src/deflate/decode.rs | 7 +++++++ src/gzip.rs | 7 +++++++ src/zlib.rs | 26 ++++++++++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/src/deflate/decode.rs b/src/deflate/decode.rs index 273201c..492e2e4 100644 --- a/src/deflate/decode.rs +++ b/src/deflate/decode.rs @@ -72,6 +72,13 @@ where self.bit_reader.into_inner() } + /// Returns the data that has been decoded but has not yet been read. + /// + /// This method is useful to retrieve partial decoded data when the decoding process is failed. + pub fn unread_decoded_data(&self) -> &[u8] { + self.lz77_decoder.buffer() + } + pub(crate) fn reset(&mut self) { self.bit_reader.reset(); self.lz77_decoder.clear(); diff --git a/src/gzip.rs b/src/gzip.rs index 29eee42..52d4e1a 100644 --- a/src/gzip.rs +++ b/src/gzip.rs @@ -1011,6 +1011,13 @@ where self.reader.into_inner() } + /// Returns the data that has been decoded but has not yet been read. + /// + /// This method is useful to retrieve partial decoded data when the decoding process is failed. + pub fn unread_decoded_data(&self) -> &[u8] { + self.reader.unread_decoded_data() + } + fn with_header(inner: R, header: Header) -> Self { Decoder { header, diff --git a/src/zlib.rs b/src/zlib.rs index 39add9a..e801c68 100644 --- a/src/zlib.rs +++ b/src/zlib.rs @@ -374,6 +374,13 @@ where pub fn into_inner(self) -> R { self.reader.into_inner() } + + /// Returns the data that has been decoded but has not yet been read. + /// + /// This method is useful to retrieve partial decoded data when the decoding process is failed. + pub fn unread_decoded_data(&self) -> &[u8] { + self.reader.unread_decoded_data() + } } impl io::Read for Decoder where @@ -928,4 +935,23 @@ mod tests { decoder.read_to_end(&mut buf).unwrap(); assert_eq!(buf, b"Hello World"); } + + #[test] + fn issue71() { + let encoded_data = [ + 120, 218, 251, 255, 207, 144, 193, 138, 193, 151, 161, 146, 33, 143, 33, 149, 161, 156, + 161, 24, 72, 38, 51, 148, 48, 100, 50, 228, 3, 69, 120, 25, 184, 24, + ]; + + let mut decoder = Decoder::new(&encoded_data[..]).unwrap(); + let mut buf = Vec::new(); + let result = decoder.read_to_end(&mut buf); + assert!(result.is_err()); + + let decoded_data = [ + 255, 254, 49, 0, 58, 0, 77, 0, 121, 0, 110, 0, 101, 0, 119, 0, 115, 0, 101, 0, 99, 0, + 116, 0, 105, 0, 111, 0, 110, 0, 13, 0, 10, + ]; + assert_eq!(decoder.unread_decoded_data(), decoded_data); + } }