kube_client/client/middleware/
extra_headers.rs1use std::sync::Arc;
2
3use http::{header::HeaderName, request::Request, HeaderValue};
4use tower::{Layer, Service};
5
6#[derive(Clone)]
7pub struct ExtraHeadersLayer {
9 pub(crate) headers: Arc<Vec<(HeaderName, HeaderValue)>>,
10}
11
12impl<S> Layer<S> for ExtraHeadersLayer {
13 type Service = ExtraHeaders<S>;
14
15 fn layer(&self, inner: S) -> Self::Service {
16 ExtraHeaders {
17 inner,
18 headers: self.headers.clone(),
19 }
20 }
21}
22
23#[derive(Clone)]
24pub struct ExtraHeaders<S> {
26 inner: S,
27 headers: Arc<Vec<(HeaderName, HeaderValue)>>,
28}
29
30impl<S, ReqBody> Service<Request<ReqBody>> for ExtraHeaders<S>
31where
32 S: Service<Request<ReqBody>>,
33{
34 type Error = S::Error;
35 type Future = S::Future;
36 type Response = S::Response;
37
38 fn poll_ready(&mut self, cx: &mut std::task::Context<'_>) -> std::task::Poll<Result<(), Self::Error>> {
39 self.inner.poll_ready(cx)
40 }
41
42 fn call(&mut self, mut req: Request<ReqBody>) -> Self::Future {
43 req.headers_mut().extend(self.headers.iter().cloned());
44 self.inner.call(req)
45 }
46}