Skip to content

Commit d26b298

Browse files
committed
Update read_skippable_frame to take a Write parameter
1 parent f75bcf8 commit d26b298

File tree

2 files changed

+8
-9
lines changed

2 files changed

+8
-9
lines changed

src/stream/read/mod.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#[cfg(feature = "experimental")]
33
use std::cmp::min;
44
#[cfg(feature = "experimental")]
5-
use std::io::{SeekFrom, Seek};
5+
use std::io::{SeekFrom, Seek, Write};
66
use std::io::{self, BufRead, BufReader, Read};
77
#[cfg(feature = "experimental")]
88
use std::mem::size_of;
@@ -106,7 +106,7 @@ impl<'a, R: Read + Seek> Decoder<'a, BufReader<R>> {
106106

107107
/// Attempt to read a skippable frame and write its content to `dest`.
108108
/// If it cannot read a skippable frame, the reader will be back to its starting position.
109-
pub fn read_skippable_frame(&mut self, dest: &mut [u8]) -> io::Result<(usize, MagicVariant)> {
109+
pub fn read_skippable_frame<W: Write>(&mut self, dest: &mut W) -> io::Result<(usize, MagicVariant)> {
110110
let magic_buffer = self.reader.peek_4bytes()?;
111111
let op = self.reader.operation();
112112
if !op.is_skippable_frame(&magic_buffer) {
@@ -121,12 +121,8 @@ impl<'a, R: Read + Seek> Decoder<'a, BufReader<R>> {
121121
self.reader.reader_mut().read_exact(&mut buffer)?;
122122
let content_size = u32::from_le_bytes(buffer) as usize;
123123

124-
if content_size > dest.len() {
125-
return Err(io::Error::new(io::ErrorKind::Other, "Destination buffer is too small"));
126-
}
127-
128124
if content_size > 0 {
129-
self.reader.reader_mut().read_exact(&mut dest[..content_size])?;
125+
std::io::copy(&mut self.reader.reader_mut().take(content_size as u64), dest)?;
130126
}
131127

132128
let magic_variant = magic_number - MAGIC_SKIPPABLE_START;

src/stream/zio/writer.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ mod tests {
346346
// Decompress and skip a frame.
347347
let mut decoder = Decoder::new(data).unwrap().single_frame();
348348

349-
let mut frame = vec![0; 20];
349+
let mut frame = vec![];
350350
let (size, _) = decoder.read_skippable_frame(&mut frame).unwrap();
351351
assert_eq!("test content", String::from_utf8_lossy(&frame[..size]));
352352

@@ -370,6 +370,7 @@ mod tests {
370370
.single_frame()
371371
};
372372

373+
let mut frame = vec![];
373374
let (size, _) = decoder.read_skippable_frame(&mut frame).unwrap();
374375
assert_eq!("SKIP", String::from_utf8_lossy(&frame[..size]));
375376

@@ -384,6 +385,7 @@ mod tests {
384385
.single_frame()
385386
};
386387

388+
let mut frame = vec![];
387389
let (size, _) = decoder.read_skippable_frame(&mut frame).unwrap();
388390
assert_eq!("end", String::from_utf8_lossy(&frame[..size]));
389391

@@ -432,10 +434,11 @@ mod tests {
432434
.single_frame()
433435
};
434436

435-
let mut frame = vec![0; 20];
437+
let mut frame = vec![];
436438
let (size, _) = decoder.read_skippable_frame(&mut frame).unwrap();
437439
assert_eq!("SKIP", String::from_utf8_lossy(&frame[..size]));
438440

441+
let mut frame = vec![];
439442
let (size, _) = decoder.read_skippable_frame(&mut frame).unwrap();
440443
assert_eq!("second skip frame", String::from_utf8_lossy(&frame[..size]));
441444
}

0 commit comments

Comments
 (0)