fire_http_representation/header/
mod.rs

1use std::net::SocketAddr;
2
3pub use http::{Method, StatusCode, Uri};
4
5pub mod url;
6pub use url::Url;
7
8mod contenttype;
9pub use contenttype::{ContentType, Mime};
10
11pub mod values;
12pub use values::{HeaderValue, HeaderValues};
13
14pub use constants::*;
15
16/// RequestHeader received from a client.
17#[derive(Debug, Clone)]
18pub struct RequestHeader {
19	pub address: SocketAddr,
20	pub method: Method,
21	pub uri: Uri,
22	pub values: HeaderValues,
23}
24
25impl RequestHeader {
26	/// Returns the ip address of the requesting client.
27	pub fn address(&self) -> &SocketAddr {
28		&self.address
29	}
30
31	/// Returns the requesting method.
32	pub fn method(&self) -> &Method {
33		&self.method
34	}
35
36	/// Returns the requesting uri.
37	pub fn uri(&self) -> &Uri {
38		&self.uri
39	}
40
41	pub fn to_url(&self) -> Option<Url> {
42		Url::from_inner(self.uri.clone())
43	}
44
45	/// Returns all header values.
46	pub fn values(&self) -> &HeaderValues {
47		&self.values
48	}
49
50	/// Returns a header value from it's key if it exists and is valid ascii.
51	///
52	/// ## Note
53	/// If you wan't a decoded value use `self.values().get_decoded(key)`.
54	pub fn value<K>(&self, key: K) -> Option<&str>
55	where
56		K: values::AsHeaderName,
57	{
58		self.values.get_str(key)
59	}
60}
61
62/// ResponseHeader created from a server.
63///
64/// To create a ResponseHeader you should probably
65/// use ResponseHeaderBuilder.
66#[derive(Debug, Clone)]
67pub struct ResponseHeader {
68	pub status_code: StatusCode,
69	pub content_type: ContentType,
70	pub values: HeaderValues,
71}
72
73impl ResponseHeader {
74	/// Returns the used status code.
75	pub fn status_code(&self) -> &StatusCode {
76		&self.status_code
77	}
78
79	/// Returns the used content type.
80	pub fn content_type(&self) -> &ContentType {
81		&self.content_type
82	}
83
84	/// Returns all header values.
85	pub fn values(&self) -> &HeaderValues {
86		&self.values
87	}
88
89	/// Returns a header value from it's key if it exists and is valid ascii.
90	///
91	/// ## Note
92	/// If you wan't a decoded value use `self.values().get_decoded(key)`.
93	pub fn value<K>(&self, key: K) -> Option<&str>
94	where
95		K: values::AsHeaderName,
96	{
97		self.values.get_str(key)
98	}
99}
100
101impl Default for ResponseHeader {
102	fn default() -> Self {
103		Self {
104			status_code: StatusCode::OK,
105			content_type: ContentType::None,
106			values: HeaderValues::new(),
107		}
108	}
109}
110
111mod constants {
112	pub use hyper::header::{
113		ACCEPT, ACCEPT_CHARSET, ACCEPT_ENCODING, ACCEPT_LANGUAGE,
114		ACCEPT_RANGES, ACCESS_CONTROL_ALLOW_CREDENTIALS,
115		ACCESS_CONTROL_ALLOW_HEADERS, ACCESS_CONTROL_ALLOW_METHODS,
116		ACCESS_CONTROL_ALLOW_ORIGIN, ACCESS_CONTROL_EXPOSE_HEADERS,
117		ACCESS_CONTROL_MAX_AGE, ACCESS_CONTROL_REQUEST_HEADERS,
118		ACCESS_CONTROL_REQUEST_METHOD, AGE, ALLOW, ALT_SVC, AUTHORIZATION,
119		CACHE_CONTROL, CONNECTION, CONTENT_DISPOSITION, CONTENT_ENCODING,
120		CONTENT_LANGUAGE, CONTENT_LENGTH, CONTENT_LOCATION, CONTENT_RANGE,
121		CONTENT_SECURITY_POLICY, CONTENT_SECURITY_POLICY_REPORT_ONLY,
122		CONTENT_TYPE, COOKIE, DATE, DNT, ETAG, EXPECT, EXPIRES, FORWARDED,
123		FROM, HOST, IF_MATCH, IF_MODIFIED_SINCE, IF_NONE_MATCH, IF_RANGE,
124		IF_UNMODIFIED_SINCE, LAST_MODIFIED, LINK, LOCATION, MAX_FORWARDS,
125		ORIGIN, PRAGMA, PROXY_AUTHENTICATE, PROXY_AUTHORIZATION,
126		PUBLIC_KEY_PINS, PUBLIC_KEY_PINS_REPORT_ONLY, RANGE, REFERER,
127		REFERRER_POLICY, REFRESH, RETRY_AFTER, SEC_WEBSOCKET_ACCEPT,
128		SEC_WEBSOCKET_EXTENSIONS, SEC_WEBSOCKET_KEY, SEC_WEBSOCKET_PROTOCOL,
129		SEC_WEBSOCKET_VERSION, SERVER, SET_COOKIE, STRICT_TRANSPORT_SECURITY,
130		TE, TRAILER, TRANSFER_ENCODING, UPGRADE, UPGRADE_INSECURE_REQUESTS,
131		USER_AGENT, VARY, VIA, WARNING, WWW_AUTHENTICATE,
132		X_CONTENT_TYPE_OPTIONS, X_DNS_PREFETCH_CONTROL, X_FRAME_OPTIONS,
133		X_XSS_PROTECTION,
134	};
135}