#http-header #header-parser #zero-copy #declarative #proc-macro #extensible #values

noggin

一个基于声明式、零拷贝、proc-macro的HTTP头部解析器

1 个不稳定版本

0.1.0 2023年10月4日

#29#header-parser

MIT 协议

22KB
356 行代码,不包括注释

Noggin

一个基于Rust的声明式、零拷贝、proc-macro头部解析器。

目录

特性

  • 声明式:使用Rust结构体定义HTTP头部,具有强类型头部值。
  • 零拷贝捕获:可选的零拷贝头部值解析。
  • 可扩展:轻松添加新的强类型头部值。

示例

定义您的HTTP头部结构,并使用noggin::Noggin推导解析逻辑。

use noggin::{Noggin, HeadParser};

#[derive(Noggin)]
pub struct TestHeaders<'a> {
    pub content_type: &'a str,
    pub content_length: u32,
    pub accept: Vec<&'a str>,
    pub connection: Option<&'a str>,
    pub pragma: Option<Vec<&'a str>>,
}

let raw_headers = b"content-type: text/html\r\n\
content-length: 12\r\n\
accept: text/html, text/plain\r\n\
pragma: no-cache, public\r\n\
accept: application/json\r\n\r\n\
hello world!";

let (parsed_headers, body) = TestHeaders::parse_headers(raw_headers).unwrap();
assert_eq!(parsed_headers.content_type, "text/html");
assert_eq!(parsed_headers.content_length, 12);
assert_eq!(parsed_headers.accept, vec!["text/html", "text/plain", "application/json"]);
assert_eq!(parsed_headers.pragma.unwrap(), vec!["no-cache", "public"]);
assert_eq!(body, b"hello world!");

测试

测试应该可以用标准的cargo test运行良好。

然而,为了保持一致性,我们建议使用docker化的测试环境。要使用docker化的测试环境,只需要makedocker(您甚至不需要在本地安装rust)。只需运行以下命令。

make test

依赖

~0.4–1MB
~22K SLoC