gotham/middleware/
security.rs1use crate::handler::HandlerFuture;
16use crate::middleware::{Middleware, NewMiddleware};
17use crate::state::State;
18
19use futures_util::future::{self, FutureExt, TryFutureExt};
20use hyper::header::{HeaderValue, X_CONTENT_TYPE_OPTIONS, X_FRAME_OPTIONS, X_XSS_PROTECTION};
21use std::pin::Pin;
22
23const XFO_VALUE: &str = "DENY";
25const XXP_VALUE: &str = "1; mode=block";
26const XCTO_VALUE: &str = "nosniff";
27
28#[derive(Clone)]
33pub struct SecurityMiddleware;
34
35impl Middleware for SecurityMiddleware {
37 fn call<Chain>(self, state: State, chain: Chain) -> Pin<Box<HandlerFuture>>
39 where
40 Chain: FnOnce(State) -> Pin<Box<HandlerFuture>>,
41 {
42 let f = chain(state).and_then(|(state, mut response)| {
43 {
44 let headers = response.headers_mut();
45
46 headers.insert(X_FRAME_OPTIONS, HeaderValue::from_static(XFO_VALUE));
47 headers.insert(X_XSS_PROTECTION, HeaderValue::from_static(XXP_VALUE));
48 headers.insert(X_CONTENT_TYPE_OPTIONS, HeaderValue::from_static(XCTO_VALUE));
49 }
50 future::ok((state, response))
51 });
52
53 f.boxed()
54 }
55}
56
57impl NewMiddleware for SecurityMiddleware {
59 type Instance = Self;
60
61 fn new_middleware(&self) -> anyhow::Result<Self::Instance> {
63 Ok(self.clone())
64 }
65}