actix_http/header/
mod.rs

1//! Pre-defined `HeaderName`s, traits for parsing and conversion, and other header utility methods.
2
3// declaring new header consts will yield this error
4#![allow(clippy::declare_interior_mutable_const)]
5
6// re-export from http except header map related items
7pub use ::http::header::{
8    HeaderName, HeaderValue, InvalidHeaderName, InvalidHeaderValue, ToStrError,
9};
10// re-export const header names, list is explicit so that any updates to `common` module do not
11// conflict with this set
12pub use ::http::header::{
13    ACCEPT, ACCEPT_CHARSET, ACCEPT_ENCODING, ACCEPT_LANGUAGE, ACCEPT_RANGES,
14    ACCESS_CONTROL_ALLOW_CREDENTIALS, ACCESS_CONTROL_ALLOW_HEADERS, ACCESS_CONTROL_ALLOW_METHODS,
15    ACCESS_CONTROL_ALLOW_ORIGIN, ACCESS_CONTROL_EXPOSE_HEADERS, ACCESS_CONTROL_MAX_AGE,
16    ACCESS_CONTROL_REQUEST_HEADERS, ACCESS_CONTROL_REQUEST_METHOD, AGE, ALLOW, ALT_SVC,
17    AUTHORIZATION, CACHE_CONTROL, CONNECTION, CONTENT_DISPOSITION, CONTENT_ENCODING,
18    CONTENT_LANGUAGE, CONTENT_LENGTH, CONTENT_LOCATION, CONTENT_RANGE, CONTENT_SECURITY_POLICY,
19    CONTENT_SECURITY_POLICY_REPORT_ONLY, CONTENT_TYPE, COOKIE, DATE, DNT, ETAG, EXPECT, EXPIRES,
20    FORWARDED, FROM, HOST, IF_MATCH, IF_MODIFIED_SINCE, IF_NONE_MATCH, IF_RANGE,
21    IF_UNMODIFIED_SINCE, LAST_MODIFIED, LINK, LOCATION, MAX_FORWARDS, ORIGIN, PRAGMA,
22    PROXY_AUTHENTICATE, PROXY_AUTHORIZATION, PUBLIC_KEY_PINS, PUBLIC_KEY_PINS_REPORT_ONLY, RANGE,
23    REFERER, REFERRER_POLICY, REFRESH, RETRY_AFTER, SEC_WEBSOCKET_ACCEPT, SEC_WEBSOCKET_EXTENSIONS,
24    SEC_WEBSOCKET_KEY, SEC_WEBSOCKET_PROTOCOL, SEC_WEBSOCKET_VERSION, SERVER, SET_COOKIE,
25    STRICT_TRANSPORT_SECURITY, TE, TRAILER, TRANSFER_ENCODING, UPGRADE, UPGRADE_INSECURE_REQUESTS,
26    USER_AGENT, VARY, VIA, WARNING, WWW_AUTHENTICATE, X_CONTENT_TYPE_OPTIONS,
27    X_DNS_PREFETCH_CONTROL, X_FRAME_OPTIONS, X_XSS_PROTECTION,
28};
29use percent_encoding::{AsciiSet, CONTROLS};
30
31use crate::{error::ParseError, HttpMessage};
32
33mod as_name;
34mod common;
35mod into_pair;
36mod into_value;
37pub mod map;
38mod shared;
39mod utils;
40
41pub use self::{
42    as_name::AsHeaderName,
43    // re-export list is explicit so that any updates to `http` do not conflict with this set
44    common::{
45        CACHE_STATUS, CDN_CACHE_CONTROL, CLEAR_SITE_DATA, CROSS_ORIGIN_EMBEDDER_POLICY,
46        CROSS_ORIGIN_OPENER_POLICY, CROSS_ORIGIN_RESOURCE_POLICY, PERMISSIONS_POLICY,
47        X_FORWARDED_FOR, X_FORWARDED_HOST, X_FORWARDED_PROTO,
48    },
49    into_pair::TryIntoHeaderPair,
50    into_value::TryIntoHeaderValue,
51    map::HeaderMap,
52    shared::{
53        parse_extended_value, q, Charset, ContentEncoding, ExtendedValue, HttpDate, LanguageTag,
54        Quality, QualityItem,
55    },
56    utils::{fmt_comma_delimited, from_comma_delimited, from_one_raw_str, http_percent_encode},
57};
58
59/// An interface for types that already represent a valid header.
60pub trait Header: TryIntoHeaderValue {
61    /// Returns the name of the header field.
62    fn name() -> HeaderName;
63
64    /// Parse the header from a HTTP message.
65    fn parse<M: HttpMessage>(msg: &M) -> Result<Self, ParseError>;
66}
67
68/// This encode set is used for HTTP header values and is defined at
69/// <https://datatracker.ietf.org/doc/html/rfc5987#section-3.2>.
70pub(crate) const HTTP_VALUE: &AsciiSet = &CONTROLS
71    .add(b' ')
72    .add(b'"')
73    .add(b'%')
74    .add(b'\'')
75    .add(b'(')
76    .add(b')')
77    .add(b'*')
78    .add(b',')
79    .add(b'/')
80    .add(b':')
81    .add(b';')
82    .add(b'<')
83    .add(b'-')
84    .add(b'>')
85    .add(b'?')
86    .add(b'[')
87    .add(b'\\')
88    .add(b']')
89    .add(b'{')
90    .add(b'}');