1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
use http::{header::HeaderName, HeaderMap, HeaderValue, Request, Response};
pub mod request;
pub mod response;
#[doc(inline)]
pub use self::{
request::{SetRequestHeader, SetRequestHeaderLayer},
response::{SetResponseHeader, SetResponseHeaderLayer},
};
pub trait MakeHeaderValue<T> {
fn make_header_value(&mut self, message: &T) -> Option<HeaderValue>;
}
impl<F, T> MakeHeaderValue<T> for F
where
F: FnMut(&T) -> Option<HeaderValue>,
{
fn make_header_value(&mut self, message: &T) -> Option<HeaderValue> {
self(message)
}
}
impl<T> MakeHeaderValue<T> for HeaderValue {
fn make_header_value(&mut self, _message: &T) -> Option<HeaderValue> {
Some(self.clone())
}
}
impl<T> MakeHeaderValue<T> for Option<HeaderValue> {
fn make_header_value(&mut self, _message: &T) -> Option<HeaderValue> {
self.clone()
}
}
#[derive(Debug, Clone, Copy)]
enum InsertHeaderMode {
Override,
Append,
IfNotPresent,
}
impl InsertHeaderMode {
fn apply<T, M>(self, header_name: &HeaderName, target: &mut T, make: &mut M)
where
T: Headers,
M: MakeHeaderValue<T>,
{
match self {
InsertHeaderMode::Override => {
if let Some(value) = make.make_header_value(target) {
target.headers_mut().insert(header_name.clone(), value);
}
}
InsertHeaderMode::IfNotPresent => {
if !target.headers().contains_key(header_name) {
if let Some(value) = make.make_header_value(target) {
target.headers_mut().insert(header_name.clone(), value);
}
}
}
InsertHeaderMode::Append => {
if let Some(value) = make.make_header_value(target) {
target.headers_mut().append(header_name.clone(), value);
}
}
}
}
}
trait Headers {
fn headers(&self) -> &HeaderMap;
fn headers_mut(&mut self) -> &mut HeaderMap;
}
impl<B> Headers for Request<B> {
fn headers(&self) -> &HeaderMap {
Request::headers(self)
}
fn headers_mut(&mut self) -> &mut HeaderMap {
Request::headers_mut(self)
}
}
impl<B> Headers for Response<B> {
fn headers(&self) -> &HeaderMap {
Response::headers(self)
}
fn headers_mut(&mut self) -> &mut HeaderMap {
Response::headers_mut(self)
}
}