/rust/registry/src/index.crates.io-1949cf8c6b5b557f/ureq-3.3.0/src/body/limit.rs
Line | Count | Source |
1 | | use std::io; |
2 | | |
3 | | use crate::Error; |
4 | | |
5 | | pub(crate) struct LimitReader<R> { |
6 | | reader: R, |
7 | | limit: u64, |
8 | | left: u64, |
9 | | } |
10 | | |
11 | | impl<R> LimitReader<R> { |
12 | 0 | pub fn new(reader: R, limit: u64) -> Self { |
13 | 0 | LimitReader { |
14 | 0 | reader, |
15 | 0 | limit, |
16 | 0 | left: limit, |
17 | 0 | } |
18 | 0 | } |
19 | | } |
20 | | |
21 | | impl<R: io::Read> io::Read for LimitReader<R> { |
22 | 0 | fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { |
23 | 0 | if self.left == 0 { |
24 | 0 | return Err(Error::BodyExceedsLimit(self.limit).into_io()); |
25 | 0 | } |
26 | | |
27 | | // The max buffer size is usize, which may be 32 bit. |
28 | 0 | let max = (self.left.min(usize::MAX as u64) as usize).min(buf.len()); |
29 | | |
30 | 0 | let n = self.reader.read(&mut buf[..max])?; |
31 | | |
32 | 0 | self.left -= n as u64; |
33 | | |
34 | 0 | Ok(n) |
35 | 0 | } |
36 | | } |
37 | | |
38 | | #[cfg(all(test, feature = "_test"))] |
39 | | mod test { |
40 | | use std::io; |
41 | | |
42 | | use crate::Error; |
43 | | use crate::test::init_test_log; |
44 | | use crate::transport::set_handler; |
45 | | |
46 | | #[test] |
47 | | fn short_read() { |
48 | | init_test_log(); |
49 | | set_handler("/get", 200, &[("content-length", "10")], b"hello"); |
50 | | let mut res = crate::get("https://my.test/get").call().unwrap(); |
51 | | let err = res.body_mut().read_to_string().unwrap_err(); |
52 | | let ioe = err.into_io(); |
53 | | assert_eq!(ioe.kind(), io::ErrorKind::UnexpectedEof); |
54 | | } |
55 | | |
56 | | #[test] |
57 | | fn limit_below_size() { |
58 | | init_test_log(); |
59 | | set_handler("/get", 200, &[("content-length", "5")], b"hello"); |
60 | | let mut res = crate::get("https://my.test/get").call().unwrap(); |
61 | | let err = res |
62 | | .body_mut() |
63 | | .with_config() |
64 | | .limit(3) |
65 | | .read_to_string() |
66 | | .unwrap_err(); |
67 | | println!("{:?}", err); |
68 | | assert!(matches!(err, Error::BodyExceedsLimit(3))); |
69 | | } |
70 | | } |