4个版本 (稳定)
使用旧的Rust 2015
1.1.0 | 2023年12月5日 |
---|---|
1.0.1 | 2023年9月16日 |
1.0.0 | 2023年4月19日 |
0.3.8 | 2023年4月13日 |
#923 in Web编程
78 每月下载次数
330KB
6K SLoC
Rust HTTP头,支持Accept-Encoding + zstd内容编码
一个headers crate分支,支持Accept-Encoding
+ zstd内容编码,并与hyperium/headers上游同步。
这个分支由static-web-server使用。
lib.rs
:
类型化HTTP头
hyper认为头应该具有强类型,因为这是我们使用Rust的原因。要设置或获取任何头,对象必须实现此模块中的Header
特质。已经提供了几个常见的头,例如Host
、ContentType
、UserAgent
等。
为什么是类型化?
或者说,为什么不使用字符串类型化?类型提供了以下优势
- 更难打字错误,因为类型中的错误应该由编译器捕获
- 默认解析到正确的类型
定义自定义头
实现Header
特质
考虑一个Do Not Track头。它可以是真的或假的,但它通过数字1
和0
来表示。
extern crate http;
extern crate headers;
use headers::{Header, HeaderName, HeaderValue};
struct Dnt(bool);
impl Header for Dnt {
fn name() -> &'static HeaderName {
&http::header::DNT
}
fn decode<'i, I>(values: &mut I) -> Result<Self, headers::Error>
where
I: Iterator<Item = &'i HeaderValue>,
{
let value = values
.next()
.ok_or_else(headers::Error::invalid)?;
if value == "0" {
Ok(Dnt(false))
} else if value == "1" {
Ok(Dnt(true))
} else {
Err(headers::Error::invalid())
}
}
fn encode<E>(&self, values: &mut E)
where
E: Extend<HeaderValue>,
{
let s = if self.0 {
"1"
} else {
"0"
};
let value = HeaderValue::from_static(s);
values.extend(std::iter::once(value));
}
}
依赖关系
~2MB
~34K SLoC