Expand description
Headers container, and common header fields.
mco_http 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 mco_http;
use mco_http::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 mco_http::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>]) -> mco_http::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(mco_http::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
- Utility functions for Header implementations.
Macros
Structs
Acceptheader, defined in RFC7231Accept-Charsetheader, defined in RFC7231Accept-Encodingheader, defined in RFC7231Accept-Languageheader, defined in RFC7231Accept-Rangesheader, defined in RFC7233Access-Control-Allow-Credentialsheader, part of CORSAccess-Control-Allow-Headersheader, part of CORSAccess-Control-Allow-Methodsheader, part of CORSAccess-Control-Expose-Headersheader, part of CORSAccess-Control-Max-Ageheader, part of CORSAccess-Control-Request-Headersheader, part of CORSAccess-Control-Request-Methodheader, part of CORSAllowheader, defined in RFC7231Authorizationheader, defined in RFC7235- Credential holder for Basic Authentication
- Token holder for Bearer Authentication, most often seen with oauth
Cache-Controlheader, defined in RFC7234Connectionheader, defined in RFC7230- A
Content-Dispositionheader, (re)defined in RFC6266 Content-Encodingheader, defined in RFC7231Content-Languageheader, defined in RFC7231Content-Lengthheader, defined in RFC7230Content-Rangeheader, defined in RFC7233Content-Typeheader, defined in RFC7231Cookieheader, defined in RFC6265Dateheader, defined in RFC7231ETagheader, defined in RFC7232- An entity tag, defined in RFC7232
Expiresheader, defined in RFC7234Fromheader, defined in RFC7231- HeaderFormatterDeprecatedA wrapper around any Header with a Display impl that calls fmt_header.
- Returned with the
HeadersItemsiterator. - A map of header fields on requests and responses.
- An
Iteratorover the fields in aHeadersmap. - The
Hostheader. - A
time::Timewith HTTP formatting and parsing If-Modified-Sinceheader, defined in RFC7232If-Unmodified-Sinceheader, defined in RFC7232Last-Modifiedheader, defined in RFC7232- The
Linkheader, defined in RFC5988 Locationheader, defined in RFC7231- The
Originheader. Preferheader, defined in RFC7240Preference-Appliedheader, defined in RFC7240- Protocols that appear in the
Upgradeheader field - Represents a quality used in quality values.
- Represents an item with a quality value as defined in RFC7231.
Refererheader, defined in RFC7231Serverheader, defined in RFC7231Set-Cookieheader, defined RFC6265StrictTransportSecurityheader, defined in RFC6797Transfer-Encodingheader, defined in RFC7230Upgradeheader, defined in RFC7230User-Agentheader, defined in RFC7231
Enums
- The
Access-Control-Allow-Originresponse header, part of CORS - Each
Range::Bytesheader can contain one or moreByteRangeSpecs. EachByteRangeSpecdefines a range of bytes to fetch CacheControlcontains a list of these directives.- A Mime charset.
- Values that can be in the
Connectionheader. - Content-Range, described in RFC7233
- A parameter to the disposition type
- The implied disposition of the content of the HTTP body
- A value to represent an encoding used in
Transfer-EncodingorAccept-Encodingheader. - The
Expectheader. If-Matchheader, defined in RFC7232If-None-Matchheader, defined in RFC7232If-Rangeheader, defined in RFC7233- A Media Descriptors Enum based on: https://www.w3.org/TR/html401/types.html#h-6.13
- The
Pragmaheader defined by HTTP/1.0. - Prefer contains a list of these preferences.
- A protocol name used to identify a spefic protocol. Names are case-sensitive except for the
WebSocketvalue. Rangeheader, defined in RFC7233- Range Units, described in RFC7233
Referrer-Policyheader, part of Referrer Policy- A Link Relation Type Enum based on: RFC5988
Varyheader, defined in RFC7231
Traits
- A trait for any object that will represent a header field and value.
- Internal implementation detail.
- A trait for any object that will represent a header field and value.
- An Authorization scheme to be used in the header.
Functions
- Convenience function to create a
Qualityfrom a float. - Convinience function to wrap a value in a
QualityItemSetsqto the default 1.0