1 个不稳定版本
使用旧的Rust 2015
0.1.0 | 2023年11月26日 |
---|
#7 in #headers
315KB
6K SLoC
rust http 头部
类型化HTTP头部。
lib.rs
:
类型化HTTP头部
hyper 认为,头部应该是强类型的,因为这就是我们最初使用Rust的原因。为了设置或获取任何头部,对象必须实现此模块中的 Header
特性。已提供一些常见头部,例如 Host
、ContentType
、UserAgent
等。
为什么是类型化的?
或者,为什么不使用字符串类型?类型化提供以下优势:
- 由于类型错误应由编译器捕获,因此更难发生拼写错误
- 默认情况下解析到正确的类型
定义自定义头部
实现 Header
特性
考虑一个不跟踪头部。它可以是true或false,但它通过数字 1
和 0
来表示。
extern crate http;
extern crate silent_headers;
use silent_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, silent_headers::Error>
where
I: Iterator<Item = &'i HeaderValue>,
{
let value = values
.next()
.ok_or_else(silent_headers::Error::invalid)?;
if value == "0" {
Ok(Dnt(false))
} else if value == "1" {
Ok(Dnt(true))
} else {
Err(silent_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));
}
}
依赖项
~1.5MB
~24K SLoC