use http::header::{
CONTENT_SECURITY_POLICY, STRICT_TRANSPORT_SECURITY, X_CONTENT_TYPE_OPTIONS, X_FRAME_OPTIONS,
};
use hyper::{Body, Request, Response};
use crate::{handler::RequestHandlerOpts, Error};
pub(crate) fn init(enabled: bool, handler_opts: &mut RequestHandlerOpts) {
handler_opts.security_headers = enabled;
tracing::info!("security headers: enabled={enabled}");
}
pub(crate) fn post_process<T>(
opts: &RequestHandlerOpts,
_req: &Request<T>,
mut resp: Response<Body>,
) -> Result<Response<Body>, Error> {
if opts.security_headers {
append_headers(&mut resp);
}
Ok(resp)
}
pub fn append_headers(resp: &mut Response<Body>) {
resp.headers_mut().insert(
STRICT_TRANSPORT_SECURITY,
"max-age=63072000; includeSubDomains; preload"
.parse()
.unwrap(),
);
resp.headers_mut()
.insert(X_FRAME_OPTIONS, "DENY".parse().unwrap());
resp.headers_mut()
.insert(X_CONTENT_TYPE_OPTIONS, "nosniff".parse().unwrap());
resp.headers_mut().insert(
CONTENT_SECURITY_POLICY,
"frame-ancestors 'self'".parse().unwrap(),
);
}