#http-header #header #hyper #hyper-http #hyperium

headers-accept-encoding

支持Accept-Encoding + zstd的Hypper类型HTTP头

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编程

Download history 357/week @ 2024-04-11 228/week @ 2024-04-18 118/week @ 2024-04-25 99/week @ 2024-05-02 54/week @ 2024-05-09 4/week @ 2024-05-16 1/week @ 2024-05-23 5/week @ 2024-05-30 12/week @ 2024-06-06 23/week @ 2024-06-13 15/week @ 2024-06-20 10/week @ 2024-06-27 56/week @ 2024-07-04 2/week @ 2024-07-18 14/week @ 2024-07-25

78 每月下载次数

MIT许可

330KB
6K SLoC

Rust HTTP头,支持Accept-Encoding + zstd内容编码

Build Status

一个headers crate分支,支持Accept-Encoding + zstd内容编码,并与hyperium/headers上游同步。

这个分支由static-web-server使用。


lib.rs:

类型化HTTP头

hyper认为头应该具有强类型,因为这是我们使用Rust的原因。要设置或获取任何头,对象必须实现此模块中的Header特质。已经提供了几个常见的头,例如HostContentTypeUserAgent等。

为什么是类型化?

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

  • 更难打字错误,因为类型中的错误应该由编译器捕获
  • 默认解析到正确的类型

定义自定义头

实现Header特质

考虑一个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
~34K SLoC