diff options
author | Justus Winter <justus@sequoia-pgp.org> | 2019-02-20 16:34:16 +0100 |
---|---|---|
committer | Justus Winter <justus@sequoia-pgp.org> | 2019-04-02 14:17:41 +0200 |
commit | d8c7542c5bb8566d030d8b2fed78c3af4672007b (patch) | |
tree | 840ceb06de7824f01568247561b7833feead3460 /buffered-reader | |
parent | 8d6171609768fece9ffc8935b6d1c4abf3fb407d (diff) |
buffered-reader: New predicate BufferedReader::consummated.
Diffstat (limited to 'buffered-reader')
-rw-r--r-- | buffered-reader/src/lib.rs | 21 | ||||
-rw-r--r-- | buffered-reader/src/limitor.rs | 18 |
2 files changed, 39 insertions, 0 deletions
diff --git a/buffered-reader/src/lib.rs b/buffered-reader/src/lib.rs index 297d1b79..764cec99 100644 --- a/buffered-reader/src/lib.rs +++ b/buffered-reader/src/lib.rs @@ -565,6 +565,23 @@ pub trait BufferedReader<C> : io::Read + fmt::Debug + fmt::Display { self.data_hard(1).is_err() } + /// Checks whether this reader is consummated. + /// + /// For most readers, this function will return true once the end + /// of the stream is reached. However, some readers are concerned + /// with packet framing (e.g. the [`Limitor`]). Those readers + /// consider themselves consummated if the amount of data + /// indicated by the packet frame is consumed. + /// + /// This allows us to detect truncation. A packet is truncated, + /// iff the end of the stream is reached, but the reader is not + /// consummated. + /// + /// [`Limitor`]: struct.Limitor.html + fn consummated(&mut self) -> bool { + self.eof() + } + /// A convenience function for reading a 16-bit unsigned integer /// in big endian format. fn read_be_u16(&mut self) -> Result<u16, std::io::Error> { @@ -816,6 +833,10 @@ impl <'a, C> BufferedReader<C> for Box<BufferedReader<C> + 'a> { return self.as_mut().data_consume_hard(amount); } + fn consummated(&mut self) -> bool { + self.as_mut().consummated() + } + fn read_be_u16(&mut self) -> Result<u16, std::io::Error> { return self.as_mut().read_be_u16(); } diff --git a/buffered-reader/src/limitor.rs b/buffered-reader/src/limitor.rs index 78fcd34a..7c371467 100644 --- a/buffered-reader/src/limitor.rs +++ b/buffered-reader/src/limitor.rs @@ -120,6 +120,10 @@ impl<'a, C> BufferedReader<C> for Limitor<'a, C> { return result; } + fn consummated(&mut self) -> bool { + self.limit == 0 + } + fn get_mut(&mut self) -> Option<&mut BufferedReader<C>> { Some(&mut self.reader) } @@ -288,4 +292,18 @@ mod test { } } } + + #[test] + fn consummated() { + let data = b"0123456789"; + + let mut l = Limitor::new(Box::new(Memory::new(data)), 10); + l.drop_eof().unwrap(); + assert!(l.consummated()); + + let mut l = Limitor::new(Box::new(Memory::new(data)), 20); + l.drop_eof().unwrap(); + eprintln!("{:?}", l); + assert!(! l.consummated()); + } } |