1#![allow(clippy::declare_interior_mutable_const)]
5
6pub use ::http::header::{
8 HeaderName, HeaderValue, InvalidHeaderName, InvalidHeaderValue, ToStrError,
9};
10pub 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 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
59pub trait Header: TryIntoHeaderValue {
61 fn name() -> HeaderName;
63
64 fn parse<M: HttpMessage>(msg: &M) -> Result<Self, ParseError>;
66}
67
68pub(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'}');