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
use std::convert::TryFrom; use crate::http::{ self, header::{HeaderMap, HeaderName, HeaderValue}, }; use crate::{ middleware::{Middleware, Next}, }; use crate::request::request::Request; use crate::response::response::Response; #[derive(Debug, Clone, Default)] pub struct DefaultHeaders { headers: HeaderMap, } impl DefaultHeaders { pub fn new() -> DefaultHeaders { DefaultHeaders { headers: HeaderMap::new(), } } pub fn header<K, V>(&mut self, name: K, value: V) where HeaderName: TryFrom<K>, <HeaderName as TryFrom<K>>::Error: Into<http::Error>, HeaderValue: TryFrom<V>, <HeaderValue as TryFrom<V>>::Error: Into<http::Error>, { match crate::utils::utils::parse_header(name, value) { Ok((name, value)) => { self.headers.insert(name, value); } Err(e) => { tracing::error!("DefaultHeaders.header error: {}", e); } } } async fn append_header<'a>(&'a self, ctx: Request, next: Next<'a>) -> Response { let mut resp: Response = next.run(ctx).await; let headers = resp.headers_mut(); for (k, v) in &self.headers { headers.append(k, v.clone()); } resp } } #[crate::async_trait] impl Middleware for DefaultHeaders { async fn handle<'a>(&'a self, ctx: Request, next: Next<'a>) -> Response { self.append_header(ctx, next).await } }