1 个不稳定版本
使用旧的 Rust 2015
0.3.8 | 2024 年 4 月 24 日 |
---|
#1 in #headers
在 gitlab_client 中使用
305KB
5.5K SLoC
Rust HTTP 头部
类型化 HTTP 头部。
这是一个支持 Link 头部的分支。一旦支持合并到上游,应该停止使用。
lib.rs
:
类型化 HTTP 头部
hyper 认为,头部应该是强类型化的,因为这是我们使用 Rust 的原因。要设置或获取任何头部,必须实现此模块中的 Header
trait。已提供一些常见的头部,如 Host
、ContentType
、UserAgent
等。
为什么是类型化?
或者,为什么不使用字符串类型化?类型提供了以下优势
- 更难拼写错误,因为类型中的错误应该被编译器捕获
- 默认解析为适当的类型
定义自定义头部
实现 Header
trait
考虑一个 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
~39K SLoC