#http-header #header #hyper #hyperium

已删除 silent-headers

类型化的HTTP头部

1 个不稳定版本

使用旧的Rust 2015

0.1.0 2023年11月26日

#7 in #headers

MIT 许可证

315KB
6K SLoC

rust http 头部

Build Status

类型化HTTP头部。


lib.rs:

类型化HTTP头部

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

为什么是类型化的?

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

  • 由于类型错误应由编译器捕获,因此更难发生拼写错误
  • 默认情况下解析到正确的类型

定义自定义头部

实现 Header 特性

考虑一个不跟踪头部。它可以是true或false,但它通过数字 10 来表示。

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