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