3个版本
使用旧的Rust 2015
0.5.2 | 2017年2月1日 |
---|---|
0.5.1 | 2017年1月30日 |
0.5.0 | 2017年1月30日 |
35 在 #request-body
每月下载 21 次
用于 uhttp_json_api
10KB
117 行
uhttp_body_bytes -- HTTP请求体字节的迭代器
此crate提供了一个迭代器,用于生成HTTP请求体中的字节。特别是,它为将数据直接从 TcpStream
读取到固定大小的缓冲区,并在第一次读取后,缓冲区包含请求头以及请求体的某些初始块的使用场景提供了便利。
此迭代器可以生成该部分块的字节,然后重用整个缓冲区来读取进一步的请求体块,并生成这些块的字节。结果可以输入到如 serde_json::from_iter 这样的基于字节的解析器中。
示例
use uhttp_body_bytes::BodyBytes;
use std::io::{Cursor, Read};
// Create a sample POST request with json payload.
let request = b"POST / HTTP/1.1\r\nHost: w3.org\r\n\r\n{\"k\": 42}";
let mut stream = Cursor::new(&request[..]);
// Simulate reading request-line/headers and partial body into a fixed-size buffer.
let mut buf = [0; 36];
let nbytes = stream.read(&mut buf[..]).unwrap();
assert_eq!(nbytes, 36);
assert_eq!(&buf[..], &b"POST / HTTP/1.1\r\nHost: w3.org\r\n\r\n{\"k"[..]);
// Process the headers (up to byte 33.)
// [...]
let body_start = 33;
// Start reading body after end of headers.
let mut bytes = BodyBytes::new(stream, &mut buf[..], body_start, nbytes);
assert_eq!(bytes.next().unwrap().unwrap(), b'{');
assert_eq!(bytes.next().unwrap().unwrap(), b'"');
assert_eq!(bytes.next().unwrap().unwrap(), b'k');
assert_eq!(bytes.next().unwrap().unwrap(), b'"');
assert_eq!(bytes.next().unwrap().unwrap(), b':');
assert_eq!(bytes.next().unwrap().unwrap(), b' ');
assert_eq!(bytes.next().unwrap().unwrap(), b'4');
assert_eq!(bytes.next().unwrap().unwrap(), b'2');
assert_eq!(bytes.next().unwrap().unwrap(), b'}');
assert!(bytes.next().is_none());
用法
此 crate 可以通过在 Cargo.toml
中添加它作为依赖项来使用
[dependencies]
uhttp_body_bytes = "0.5.2"
并在crate根目录中导入它
extern crate uhttp_body_bytes;