satex_layer/remove_header/
remove_request_header.rs

1use std::{str::FromStr, sync::Arc};
2
3use crate::make::MakeRouteLayer;
4use crate::remove_header::Removable;
5use http::HeaderName;
6use satex_core::component::Args;
7use satex_core::{component::Configurable, Error};
8use satex_macro::make;
9use tower::{Layer, Service};
10
11#[make(kind = RemoveRequestHeader)]
12pub struct MakeRemoveRequestHeaderRouteLayer {
13    name: String,
14}
15
16impl MakeRouteLayer for MakeRemoveRequestHeaderRouteLayer {
17    type Layer = RemoveRequestHeaderLayer;
18
19    fn make(&self, args: Args) -> Result<Self::Layer, Error> {
20        Config::with_args(args).and_then(|config| {
21            HeaderName::from_str(&config.name)
22                .map_err(Error::new)
23                .map(RemoveRequestHeaderLayer::new)
24        })
25    }
26}
27
28#[derive(Debug, Clone)]
29pub struct RemoveRequestHeaderLayer {
30    name: Arc<HeaderName>,
31}
32
33impl RemoveRequestHeaderLayer {
34    pub fn new(name: HeaderName) -> Self {
35        Self {
36            name: Arc::new(name),
37        }
38    }
39}
40
41impl<S> Layer<S> for RemoveRequestHeaderLayer {
42    type Service = RemoveRequestHeader<S>;
43
44    fn layer(&self, inner: S) -> Self::Service {
45        RemoveRequestHeader {
46            name: self.name.clone(),
47            inner,
48        }
49    }
50}
51
52#[derive(Debug, Clone)]
53pub struct RemoveRequestHeader<S> {
54    inner: S,
55    name: Arc<HeaderName>,
56}
57
58impl<S, Req> Service<Req> for RemoveRequestHeader<S>
59where
60    S: Service<Req>,
61    Req: Removable,
62{
63    type Response = S::Response;
64
65    type Error = S::Error;
66
67    type Future = S::Future;
68
69    fn poll_ready(
70        &mut self,
71        cx: &mut std::task::Context<'_>,
72    ) -> std::task::Poll<Result<(), Self::Error>> {
73        self.inner.poll_ready(cx)
74    }
75
76    fn call(&mut self, mut req: Req) -> Self::Future {
77        req.remove(self.name.as_ref());
78        self.inner.call(req)
79    }
80}