static_web_server/
security_headers.rs1use http::header::{
10 CONTENT_SECURITY_POLICY, STRICT_TRANSPORT_SECURITY, X_CONTENT_TYPE_OPTIONS, X_FRAME_OPTIONS,
11};
12use hyper::{Body, Request, Response};
13
14use crate::{handler::RequestHandlerOpts, Error};
15
16pub(crate) fn init(enabled: bool, handler_opts: &mut RequestHandlerOpts) {
17 handler_opts.security_headers = enabled;
18 tracing::info!("security headers: enabled={enabled}");
19}
20
21pub(crate) fn post_process<T>(
23 opts: &RequestHandlerOpts,
24 _req: &Request<T>,
25 mut resp: Response<Body>,
26) -> Result<Response<Body>, Error> {
27 if opts.security_headers {
28 append_headers(&mut resp);
29 }
30 Ok(resp)
31}
32
33pub fn append_headers(resp: &mut Response<Body>) {
36 resp.headers_mut().insert(
38 STRICT_TRANSPORT_SECURITY,
39 "max-age=63072000; includeSubDomains; preload"
40 .parse()
41 .unwrap(),
42 );
43
44 resp.headers_mut()
46 .insert(X_FRAME_OPTIONS, "DENY".parse().unwrap());
47
48 resp.headers_mut()
50 .insert(X_CONTENT_TYPE_OPTIONS, "nosniff".parse().unwrap());
51
52 resp.headers_mut().insert(
54 CONTENT_SECURITY_POLICY,
55 "frame-ancestors 'self'".parse().unwrap(),
56 );
57}