Skip to content

Commit 6e9b9fb

Browse files
committed
handle empty input
closes #116
1 parent 7b64741 commit 6e9b9fb

2 files changed

Lines changed: 13 additions & 2 deletions

File tree

src/frame/compress.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ pub struct FrameEncoder<W: io::Write> {
8686
dst: Vec<u8>,
8787
/// Whether we have an open frame in the output.
8888
is_frame_open: bool,
89+
/// Whether we have an frame closed in the output.
90+
data_to_frame_written: bool,
8991
/// The frame information to be used in this encoder.
9092
frame_info: FrameInfo,
9193
}
@@ -140,6 +142,7 @@ impl<W: io::Write> FrameEncoder<W> {
140142
content_len: 0,
141143
dst: Vec::new(),
142144
is_frame_open: false,
145+
data_to_frame_written: false,
143146
frame_info,
144147
src_start: 0,
145148
src_end: 0,
@@ -169,8 +172,15 @@ impl<W: io::Write> FrameEncoder<W> {
169172
/// terminator.
170173
pub fn try_finish(&mut self) -> Result<(), Error> {
171174
match self.flush() {
172-
Ok(()) if self.is_frame_open => self.end_frame(),
173-
Ok(()) => Ok(()),
175+
Ok(()) => {
176+
// Empty input special case
177+
if !self.is_frame_open && !self.data_to_frame_written {
178+
self.begin_frame(0)?;
179+
}
180+
self.end_frame()?;
181+
self.data_to_frame_written = true;
182+
Ok(())
183+
}
174184
Err(err) => Err(err.into()),
175185
}
176186
}

tests/tests.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ fn test_roundtrip(bytes: impl AsRef<[u8]>) {
9595
let mut frame_info = lz4_flex::frame::FrameInfo::new();
9696
frame_info.block_mode = *bm;
9797
let compressed_flex = lz4_flex_frame_compress_with(frame_info, bytes).unwrap();
98+
dbg!(&compressed_flex);
9899
let decompressed = lz4_flex_frame_decompress(&compressed_flex).unwrap();
99100
assert_eq!(decompressed, bytes);
100101
}

0 commit comments

Comments
 (0)