Expand description
Headers container, and common header fields.
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
Hyper provides many of the most commonly used headers in HTTP. If
you need to define a custom header, it’s easy to do while still taking
advantage of the type system. Hyper includes a header! macro for defining
many wrapper-style headers.
#[macro_use] extern crate hyper;
use hyper::header::Headers;
header! { (XRequestGuid, "X-Request-Guid") => [String] }
fn main () {
let mut headers = Headers::new();
headers.set(XRequestGuid("a proper guid".to_owned()))
}This works well for simple “string” headers. But the header system actually involves 2 parts: parsing, and formatting. If you need to customize either part, you can do so.
Header and HeaderFormat
Consider a Do Not Track header. It can be true or false, but it represents
that via the numerals 1 and 0.
use std::fmt;
use hyper::header::{Header, HeaderFormat};
#[derive(Debug, Clone, Copy)]
struct Dnt(bool);
impl Header for Dnt {
fn header_name() -> &'static str {
"DNT"
}
fn parse_header(raw: &[Vec<u8>]) -> hyper::Result<Dnt> {
if raw.len() == 1 {
let line = &raw[0];
if line.len() == 1 {
let byte = line[0];
match byte {
b'0' => return Ok(Dnt(true)),
b'1' => return Ok(Dnt(false)),
_ => ()
}
}
}
Err(hyper::Error::Header)
}
}
impl HeaderFormat for Dnt {
fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
if self.0 {
f.write_str("1")
} else {
f.write_str("0")
}
}
}Modules
Macros
Structs
Accept-Charset header, defined in
RFC7231Accept-Encoding header, defined in
RFC7231Accept-Language header, defined in
RFC7231Accept-Ranges header, defined in
RFC7233Access-Control-Allow-Credentials header, part of
CORSAccess-Control-Allow-Headers header, part of
CORSAccess-Control-Allow-Methods header, part of
CORSAccess-Control-Expose-Headers header, part of
CORSAccess-Control-Max-Age header, part of
CORSAccess-Control-Request-Headers header, part of
CORSAccess-Control-Request-Method header, part of
CORSAuthorization header, defined in RFC7235Cache-Control header, defined in RFC7234Connection header, defined in
RFC7230Content-Disposition header, (re)defined in RFC6266Content-Encoding header, defined in
RFC7231Content-Language header, defined in
RFC7231Content-Length header, defined in
RFC7230Content-Range header, defined in
RFC7233Content-Type header, defined in
RFC7231HeadersItems iterator.Iterator over the fields in a Headers map.Host header.time::Time with HTTP formatting and parsingIf-Modified-Since header, defined in
RFC7232If-Unmodified-Since header, defined in
RFC7232Last-Modified header, defined in
RFC7232Origin header.Preference-Applied header, defined in RFC7240Upgrade header fieldStrictTransportSecurity header, defined in RFC6797Transfer-Encoding header, defined in
RFC7230Enums
Access-Control-Allow-Origin response header,
part of CORSRange::Bytes header can contain one or more ByteRangeSpecs.
Each ByteRangeSpec defines a range of bytes to fetchCacheControl contains a list of these directives.Connection header.Transfer-Encoding
or Accept-Encoding header.Expect header.If-None-Match header, defined in
RFC7232Pragma header defined by HTTP/1.0.WebSocket value.Referrer-Policy header, part of
Referrer Policy