16 releases

Uses old Rust 2015

0.4.0 Nov 24, 2023
0.3.8 Sep 2, 2022
0.3.7 Feb 10, 2022
0.3.5 Oct 18, 2021
0.1.0 Aug 9, 2016

#13 in Web programming

Download history 397740/week @ 2024-07-17 410978/week @ 2024-07-24 424312/week @ 2024-07-31 498810/week @ 2024-08-07 544317/week @ 2024-08-14 556767/week @ 2024-08-21 515617/week @ 2024-08-28 597993/week @ 2024-09-04 551708/week @ 2024-09-11 535284/week @ 2024-09-18 593544/week @ 2024-09-25 607269/week @ 2024-10-02 629595/week @ 2024-10-09 658619/week @ 2024-10-16 705842/week @ 2024-10-23 637450/week @ 2024-10-30

2,756,944 downloads per month
Used in 1,421 crates (171 directly)

MIT license

315KB
6K SLoC

rust http headers

Build Status

Typed HTTP headers.


lib.rs:

Typed HTTP Headers

hyper has the opinion that headers should be strongly-typed, because that's why we're using Rust in the first place. To set or get any header, an object must implement the Header trait from this module. Several common headers are already provided, such as Host, ContentType, UserAgent, and others.

Why Typed?

Or, why not stringly-typed? Types give the following advantages:

  • More difficult to typo, since typos in types should be caught by the compiler
  • Parsing to a proper type by default

Defining Custom Headers

Implementing the Header trait

Consider a Do Not Track header. It can be true or false, but it represents that via the numerals 1 and 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));
    }
}

Dependencies

~1.5MB
~25K SLoC