Skip to main content

rama_http_types/header/
mod.rs

1//! Forked from the `http` crate — vendored so rama owns its HTTP header types.
2//! See `docs/thirdparty/fork/README.md`. The fork-style lint allows below also
3//! cover the `name`/`value`/`map` child modules.
4//!
5//! HTTP header types
6//!
7//! The module provides [`HeaderName`], [`HeaderMap`], and a number of types
8//! used for interacting with `HeaderMap`. These types allow representing both
9//! HTTP/1 and HTTP/2 headers.
10//!
11//! # `HeaderName`
12//!
13//! The `HeaderName` type represents both standard header names as well as
14//! custom header names. The type handles the case insensitive nature of header
15//! names and is used as the key portion of `HeaderMap`. Header names preserve
16//! the spelling they were parsed or inserted with, while hashing and equality
17//! use HTTP's case-insensitive semantics. Lowercase wire formatting is exposed
18//! separately for HTTP/2 and HTTP/3.
19//!
20//! The internal representation is optimized to efficiently handle the cases
21//! most commonly encountered when working with HTTP. Standard header names are
22//! special cased and are represented internally as an enum. Short custom
23//! headers are stored as shared UTF-8 bytes. Standard headers keep a compact
24//! enum representation plus a small case mask when needed.
25//!
26//! ## Limitations
27//!
28//! `HeaderName` has a max length of 32,768 for header names. Attempting to
29//! parse longer names will result in a panic.
30//!
31//! # `HeaderMap`
32//!
33//! The [`HeaderMap`] type is a specialized
34//! [multimap](<https://en.wikipedia.org/wiki/Multimap>) structure for storing
35//! header names and values. It is designed specifically for efficient
36//! manipulation of HTTP headers. It supports multiple values per header name
37//! and provides specialized APIs for insertion, retrieval, and iteration.
38//!
39//! [*See also the `HeaderMap` type.*](HeaderMap)
40
41// Vendored verbatim: keep upstream's style/idioms rather than rama's. We keep
42// `clippy::correctness` active (to catch any copy error) but silence the style/
43// pedantic/nursery groups and the restriction lints upstream uses freely.
44#![allow(
45    unreachable_pub,
46    clippy::allow_attributes,
47    clippy::style,
48    clippy::complexity,
49    clippy::perf,
50    clippy::suspicious,
51    clippy::pedantic,
52    clippy::nursery,
53    clippy::unwrap_used,
54    clippy::expect_used,
55    clippy::panic,
56    clippy::unreachable,
57    clippy::get_unwrap,
58    clippy::assertions_on_result_states,
59    clippy::str_to_string,
60    clippy::let_underscore_must_use,
61    clippy::multiple_unsafe_ops_per_block,
62    clippy::unnecessary_safety_comment,
63    clippy::map_err_ignore,
64    dead_code,
65    mismatched_lifetime_syntaxes,
66    unsafe_op_in_unsafe_fn
67)]
68
69mod map;
70mod name;
71mod value;
72
73pub use self::map::{
74    AsHeaderName, Drain, Entry, GetAll, HeaderMap, IntoHeaderName, IntoIter, IntoOrderedIter, Iter,
75    IterMut, Keys, MaxSizeReached, OccupiedEntry, OrderedIter, VacantEntry, ValueDrain, ValueIter,
76    ValueIterMut, Values, ValuesMut,
77};
78pub use self::name::{
79    HeaderName, InvalidHeaderName, LowercaseHeaderName, OriginalHeaderName, StandardHeader,
80};
81pub use self::value::{HeaderValue, InvalidHeaderValue, ToStrError};
82
83// Use header name constants
84#[rustfmt::skip]
85pub use self::name::{
86    ACCEPT,
87    ACCEPT_CHARSET,
88    ACCEPT_ENCODING,
89    ACCEPT_LANGUAGE,
90    ACCEPT_RANGES,
91    ACCESS_CONTROL_ALLOW_CREDENTIALS,
92    ACCESS_CONTROL_ALLOW_HEADERS,
93    ACCESS_CONTROL_ALLOW_METHODS,
94    ACCESS_CONTROL_ALLOW_ORIGIN,
95    ACCESS_CONTROL_EXPOSE_HEADERS,
96    ACCESS_CONTROL_MAX_AGE,
97    ACCESS_CONTROL_REQUEST_HEADERS,
98    ACCESS_CONTROL_REQUEST_METHOD,
99    AGE,
100    ALLOW,
101    ALT_SVC,
102    AUTHORIZATION,
103    CACHE_CONTROL,
104    CACHE_STATUS,
105    CDN_CACHE_CONTROL,
106    CONNECTION,
107    CONTENT_DISPOSITION,
108    CONTENT_ENCODING,
109    CONTENT_LANGUAGE,
110    CONTENT_LENGTH,
111    CONTENT_LOCATION,
112    CONTENT_RANGE,
113    CONTENT_SECURITY_POLICY,
114    CONTENT_SECURITY_POLICY_REPORT_ONLY,
115    CONTENT_TYPE,
116    COOKIE,
117    DNT,
118    DATE,
119    ETAG,
120    EXPECT,
121    EXPIRES,
122    FORWARDED,
123    FROM,
124    HOST,
125    IF_MATCH,
126    IF_MODIFIED_SINCE,
127    IF_NONE_MATCH,
128    IF_RANGE,
129    IF_UNMODIFIED_SINCE,
130    LAST_MODIFIED,
131    LINK,
132    LOCATION,
133    MAX_FORWARDS,
134    ORIGIN,
135    PRAGMA,
136    PROXY_AUTHENTICATE,
137    PROXY_AUTHORIZATION,
138    PUBLIC_KEY_PINS,
139    PUBLIC_KEY_PINS_REPORT_ONLY,
140    RANGE,
141    REFERER,
142    REFERRER_POLICY,
143    REFRESH,
144    RETRY_AFTER,
145    SEC_WEBSOCKET_ACCEPT,
146    SEC_WEBSOCKET_EXTENSIONS,
147    SEC_WEBSOCKET_KEY,
148    SEC_WEBSOCKET_PROTOCOL,
149    SEC_WEBSOCKET_VERSION,
150    SERVER,
151    SET_COOKIE,
152    STRICT_TRANSPORT_SECURITY,
153    TE,
154    TRAILER,
155    TRANSFER_ENCODING,
156    UPGRADE,
157    UPGRADE_INSECURE_REQUESTS,
158    USER_AGENT,
159    VARY,
160    VIA,
161    WARNING,
162    WWW_AUTHENTICATE,
163    X_CONTENT_TYPE_OPTIONS,
164    X_DNS_PREFETCH_CONTROL,
165    X_FRAME_OPTIONS,
166    X_XSS_PROTECTION,
167    X_FORWARDED_HOST,
168    X_FORWARDED_FOR,
169    X_FORWARDED_PROTO,
170    X_ROBOTS_TAG,
171    X_CLACKS_OVERHEAD,
172    SEC_GPC,
173    SEC_FETCH_SITE,
174    PERMISSIONS_POLICY,
175    CROSS_ORIGIN_EMBEDDER_POLICY,
176    CROSS_ORIGIN_EMBEDDER_POLICY_REPORT_ONLY,
177    CROSS_ORIGIN_OPENER_POLICY,
178    CROSS_ORIGIN_OPENER_POLICY_REPORT_ONLY,
179    CROSS_ORIGIN_RESOURCE_POLICY,
180    KEEP_ALIVE,
181    PROXY_CONNECTION,
182    LAST_EVENT_ID,
183    CF_CONNECTING_IP,
184    TRUE_CLIENT_IP,
185    CLIENT_IP,
186    X_CLIENT_IP,
187    X_REAL_IP,
188    ACCESS_CONTROL_ALLOW_PRIVATE_NETWORK,
189    ACCESS_CONTROL_REQUEST_PRIVATE_NETWORK,
190    SEC_CH_SAVE_DATA,
191    SEC_CH_ECT,
192    SEC_CH_RTT,
193    SEC_CH_DOWNLINK,
194    ACCEPT_CH,
195    CRITICAL_CH,
196};
197
198/// Maximum length of a header name
199///
200/// Generally, 64kb for a header name is WAY too much than would ever be needed
201/// in practice. Restricting it to this size enables using `u16` values to
202/// represent offsets when dealing with header names.
203const MAX_HEADER_NAME_LEN: usize = (1 << 16) - 1;
204
205/// Static Header Value that is can be used as `User-Agent` or `Server` header.
206pub static RAMA_ID_HEADER_VALUE: HeaderValue = HeaderValue::from_static(const_format::formatcp!(
207    "{}/{}",
208    rama_utils::info::NAME,
209    rama_utils::info::VERSION
210));