#header #http-header #hyper #hyperium

demurgos_headers

基于类型化的 HTTP 头部的临时分支,支持 Link 头部

1 个不稳定版本

使用旧的 Rust 2015

0.3.8 2024 年 4 月 24 日

#1 in #headers


gitlab_client 中使用

MIT 许可证

305KB
5.5K SLoC

Rust HTTP 头部

Build Status

类型化 HTTP 头部。

这是一个支持 Link 头部的分支。一旦支持合并到上游,应该停止使用。


lib.rs:

类型化 HTTP 头部

hyper 认为,头部应该是强类型化的,因为这是我们使用 Rust 的原因。要设置或获取任何头部,必须实现此模块中的 Header trait。已提供一些常见的头部,如 HostContentTypeUserAgent 等。

为什么是类型化?

或者,为什么不使用字符串类型化?类型提供了以下优势

  • 更难拼写错误,因为类型中的错误应该被编译器捕获
  • 默认解析为适当的类型

定义自定义头部

实现 Header trait

考虑一个 Do Not Track 头部。它可以是真的或假的,但它通过数字 10 来表示。

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