agp_config/grpc/
headers_middleware.rs1use std::{
5 fmt,
6 task::{Context, Poll},
7};
8
9use http::{Request, Response, header::HeaderMap};
10use tower_layer::Layer;
11use tower_service::Service;
12
13#[derive(Clone)]
15pub struct SetRequestHeaderLayer {
16 header_map: HeaderMap,
17}
18
19impl fmt::Debug for SetRequestHeaderLayer {
21 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
22 f.debug_struct("SetRequestHeaderLayer")
23 .field("header_map", &self.header_map)
24 .finish()
25 }
26}
27
28impl SetRequestHeaderLayer {
29 pub fn new(header_map: HeaderMap) -> Self {
31 Self { header_map }
32 }
33}
34
35impl<S> Layer<S> for SetRequestHeaderLayer {
38 type Service = SetRequestHeader<S>;
39
40 fn layer(&self, inner: S) -> Self::Service {
41 SetRequestHeader {
42 inner,
43 header_map: self.header_map.clone(),
44 }
45 }
46}
47
48#[derive(Clone)]
50pub struct SetRequestHeader<S> {
51 inner: S,
53
54 header_map: HeaderMap,
56}
57
58impl<S> SetRequestHeader<S> {
60 pub fn apply<B>(&self, req: &mut Request<B>) {
62 for (key, value) in self.header_map.iter() {
63 req.headers_mut().insert(key, value.clone());
64 }
65 }
66}
67
68impl<S> fmt::Debug for SetRequestHeader<S>
70where
71 S: fmt::Debug,
72{
73 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
74 f.debug_struct("SetRequestHeader")
75 .field("inner", &self.inner)
76 .field("header_map", &self.header_map)
77 .finish()
78 }
79}
80
81impl<ReqBody, ResBody, S> Service<Request<ReqBody>> for SetRequestHeader<S>
83where
84 S: Service<Request<ReqBody>, Response = Response<ResBody>>,
85{
86 type Response = S::Response;
87 type Error = S::Error;
88 type Future = S::Future;
89
90 #[inline]
92 fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
93 self.inner.poll_ready(cx)
94 }
95
96 fn call(&mut self, mut req: Request<ReqBody>) -> Self::Future {
98 self.apply(&mut req);
99 self.inner.call(req)
100 }
101}