summaryrefslogtreecommitdiffstats
path: root/buffered-reader
diff options
context:
space:
mode:
authorJustus Winter <justus@sequoia-pgp.org>2019-02-20 16:34:16 +0100
committerJustus Winter <justus@sequoia-pgp.org>2019-04-02 14:17:41 +0200
commitd8c7542c5bb8566d030d8b2fed78c3af4672007b (patch)
tree840ceb06de7824f01568247561b7833feead3460 /buffered-reader
parent8d6171609768fece9ffc8935b6d1c4abf3fb407d (diff)
buffered-reader: New predicate BufferedReader::consummated.
Diffstat (limited to 'buffered-reader')
-rw-r--r--buffered-reader/src/lib.rs21
-rw-r--r--buffered-reader/src/limitor.rs18
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());
+ }
}