aster_forge_actix_middleware/
security_headers.rs1use actix_web::middleware::DefaultHeaders;
8
9pub const X_FRAME_OPTIONS_VALUE: &str = "SAMEORIGIN";
11pub const REFERRER_POLICY_VALUE: &str = "strict-origin-when-cross-origin";
13pub const X_CONTENT_TYPE_OPTIONS_VALUE: &str = "nosniff";
15
16#[must_use]
18pub fn default_headers() -> DefaultHeaders {
19 DefaultHeaders::new()
20 .add(("X-Frame-Options", X_FRAME_OPTIONS_VALUE))
21 .add(("Referrer-Policy", REFERRER_POLICY_VALUE))
22 .add(("X-Content-Type-Options", X_CONTENT_TYPE_OPTIONS_VALUE))
23}
24
25#[cfg(test)]
26mod tests {
27 use super::{
28 REFERRER_POLICY_VALUE, X_CONTENT_TYPE_OPTIONS_VALUE, X_FRAME_OPTIONS_VALUE, default_headers,
29 };
30 use actix_web::{HttpResponse, http::header, test, web};
31
32 #[actix_web::test]
33 async fn default_headers_adds_security_headers() {
34 let app = test::init_service(
35 actix_web::App::new()
36 .wrap(default_headers())
37 .route("/", web::get().to(HttpResponse::Ok)),
38 )
39 .await;
40
41 let request = test::TestRequest::get().uri("/").to_request();
42 let response = test::call_service(&app, request).await;
43
44 assert_eq!(
45 response.headers().get("x-frame-options"),
46 Some(&header::HeaderValue::from_static(X_FRAME_OPTIONS_VALUE))
47 );
48 assert_eq!(
49 response.headers().get("referrer-policy"),
50 Some(&header::HeaderValue::from_static(REFERRER_POLICY_VALUE))
51 );
52 assert_eq!(
53 response.headers().get("x-content-type-options"),
54 Some(&header::HeaderValue::from_static(
55 X_CONTENT_TYPE_OPTIONS_VALUE
56 ))
57 );
58 }
59}