16 个版本

使用旧的 Rust 2015

0.4.0 2023年11月24日
0.3.8 2022年9月2日
0.3.7 2022年2月10日
0.3.5 2021年10月18日
0.1.0 2016年8月9日

#15 in 网络编程

Download history 368051/week @ 2024-04-29 345023/week @ 2024-05-06 384454/week @ 2024-05-13 394526/week @ 2024-05-20 372881/week @ 2024-05-27 418663/week @ 2024-06-03 426267/week @ 2024-06-10 392038/week @ 2024-06-17 406242/week @ 2024-06-24 361695/week @ 2024-07-01 403804/week @ 2024-07-08 384870/week @ 2024-07-15 414637/week @ 2024-07-22 413060/week @ 2024-07-29 453599/week @ 2024-08-05 518104/week @ 2024-08-12

1,814,362 每月下载量
用于 1,322 个工具包 (160 直接)

MIT 许可证

315KB
6K SLoC

Rust HTTP 标头

Build Status

类型化的 HTTP 标头。


lib.rs:

类型化的 HTTP 标头

Hyper 认为 HTTP 标头应该是强类型化的,这正是我们使用 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));
    }
}

依赖项

~1.5MB
~25K SLoC