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 60 61 62 63 64 65 66 67 68 69 70 71 72
use crate::{Chain, HandleFuture, Middleware, Request}; use futures::FutureExt; use hyper::header::{HeaderName, HeaderValue}; #[derive(Debug, Clone)] pub struct HeadersDefault { headers: Vec<(HeaderName, HeaderValue)>, } impl HeadersDefault { pub fn new(headers: &[(&str, &str)]) -> Self { let mut ret = Self { headers: vec![] }; for (name, value) in headers { ret = ret.add(name, value); } ret } pub fn default() -> Self { Self::empty().add("x-powered-by", "reign") } pub fn empty() -> Self { Self::new(&[]) } pub fn add(mut self, name: &str, value: &str) -> Self { if name.to_lowercase() != name { panic!("Only lowercase headers are allowed"); } self.headers.push(( HeaderName::from_lowercase(name.as_bytes()).unwrap(), HeaderValue::from_str(value).unwrap(), )); self } } impl Middleware for HeadersDefault { fn handle<'m>(&'m self, req: &'m mut Request, chain: Chain<'m>) -> HandleFuture<'m> { async move { let mut response = chain.run(req).await?; for (name, value) in &self.headers { response.headers_mut().insert(name.clone(), value.clone()); } Ok(response) } .boxed() } } #[cfg(test)] mod test { use super::HeadersDefault; #[test] #[should_panic] fn test_with_uppercase() { HeadersDefault::empty().add("X-Version", "0.1"); } #[test] #[should_panic] fn test_new_with_uppercase() { HeadersDefault::new(&[("X-Version", "0.1")]); } }