4个版本 (2个重大更改)
0.3.0 | 2020年12月1日 |
---|---|
0.2.0 | 2020年5月11日 |
0.1.1 | 2020年5月9日 |
0.1.0 | 2020年5月9日 |
#2021 in Rust模式
每月30次下载
用于 imserious
16KB
164 行
read-restrict
当读取的字节数超出限制时,通过返回错误来强制执行从Read
读取的严格限制。
概要
pub fn read<P: AsRef<Path>>(path: P, restriction: usize) -> io::Result<Vec<u8>>;
pub fn read_to_string<P: AsRef<Path>>(path: P, restriction: usize) -> io::Result<String>;
pub trait ReadExt {
fn restrict(self, restriction: u64) -> Restrict<Self>;
}
impl<R: Read> ReadExt for R {}
impl<T> Restrict<T> {
pub fn restriction(&self) -> u64;
pub fn set_restriction(&mut self, restriction: u64);
pub fn into_inner(self) -> T;
pub fn get_ref(&self) -> &T;
pub fn get_mut(&mut self) -> &mut T;
}
impl<T: Read> Read for Restrict<T> {}
impl<T: BufRead> BufRead for Restrict<T> {}
描述
这是一个围绕Rust的标准io::Take
的适配器,当读取限制超出时,它不会返回Ok(0)
,而是返回错误类型ErrorKind::InvalidData
。
这旨在在仅使用take
截断时可能引起不正确行为的情况下强制执行显式的输入限制。
read_restrict
还提供了std::fs::read
和std::fs::read_to_string
的限制版本,以便方便地防止过度大的文件的未限定读取。
示例
use std::io::{Read, Result, ErrorKind};
use read_restrict::ReadExt;
fn main() -> Result<()> {
let f = std::fs::File::open("foo.txt")?;
let mut handle = f.restrict(5);
let mut buf = [0; 8];
assert_eq!(5, handle.read(&mut buf)?); // reads at most 5 bytes
assert_eq!(0, handle.restriction()); // is now exhausted
assert_eq!(ErrorKind::InvalidData, handle.read(&mut buf).unwrap_err().kind());
Ok(())
}
或者更现实地
use read_restrict::ReadExt;
fn main() -> std::io::Result<()> {
let input = std::fs::File::open("foo.json")?;
let input = std::io::BufReader::new(input); // buffer for performance
let input = input.restrict(640 * 1024); // 640k should be enough JSON for anyone
let _data = serde_json::from_reader(input)?;
Ok(())
}
或者甚至更好
fn main() -> std::io::Result<()> {
let input = read_restrict::read_to_string("foo.json", 640 * 1024)?;
let _data = serde_json::from_str(input)?;
Ok(())
}