diff --git a/src/reading.rs b/src/reading.rs index 7bdf789..adb8636 100644 --- a/src/reading.rs +++ b/src/reading.rs @@ -761,7 +761,21 @@ impl PacketReader { if let Some(pck) = self.base_pck_rdr.read_packet() { return Ok(Some(pck)); } - let page = tri!(self.read_ogg_page()); + // Save the current position to rewind if EOF is reached. + let pos = tri!(self.rdr.stream_position()); + let page = tri!(match self.read_ogg_page() { + Err(OggReadError::ReadError(e)) if e.kind() == ErrorKind::UnexpectedEof => { + // Rewind to the saved position to allow for potential re-reading. + self.rdr.seek(SeekFrom::Start(pos))?; + Err(OggReadError::ReadError(e)) + } + Ok(None) => { + // Rewind to the saved position to allow for potential re-reading. + self.rdr.seek(SeekFrom::Start(pos))?; + Ok(None) + } + ret => ret, + }); match page { Some(page) => tri!(self.base_pck_rdr.push_page(page)), None => return Ok(None), @@ -818,7 +832,8 @@ impl PacketReader { let header_buf :[u8; 27] = match tri!(self.read_until_pg_header()) { Some(s) => s, None if self.read_some_pg => return Ok(None), - None => return Err(OggReadError::NoCapturePatternFound) + None => tri!(Err(Error::new(ErrorKind::UnexpectedEof, + "Expected ogg packet but found end of physical stream"))), }; let (mut pg_prs, page_segments) = tri!(PageParser::new(header_buf)); diff --git a/src/test.rs b/src/test.rs index ff55ae7..3890f2b 100644 --- a/src/test.rs +++ b/src/test.rs @@ -542,6 +542,8 @@ fn test_issue_14() { // data is treated as invalid. #[test] fn test_issue_7() { + use std::io::ErrorKind::UnexpectedEof; + let mut c = Cursor::new(Vec::new()); let test_arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; let test_arr_2 = [2, 4, 8, 16, 32, 64, 128, 127, 126, 125, 124]; @@ -564,17 +566,19 @@ fn test_issue_7() { assert!(r.read_packet().unwrap().is_none()); } - // Non-Ogg data should return an error. + // Truncated data should return the UnexpectedEof error. let c = Cursor::new(vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); { let mut r = PacketReader::new(c); - assert!(matches!(r.read_packet(), Err(OggReadError::NoCapturePatternFound))); + assert!(matches!(r.read_packet(), + Err(OggReadError::ReadError(e)) if e.kind() == UnexpectedEof)); } - // Empty data is considered non-Ogg data. + // Empty data should return the UnexpectedEof error. let c = Cursor::new(&[]); { let mut r = PacketReader::new(c); - assert!(matches!(r.read_packet(), Err(OggReadError::NoCapturePatternFound))); + assert!(matches!(r.read_packet(), + Err(OggReadError::ReadError(e)) if e.kind() == UnexpectedEof)); } }