Coverage Report

Created: 2026-06-15 06:09

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}