satex_layer/remove_header/
remove_request_header.rs1use 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}