use reinhardt_http::Request;
use crate::csp::CspNonce;
pub fn get_csp_nonce(request: &Request) -> Option<String> {
request.extensions.get::<CspNonce>().map(|n| n.0.clone())
}
pub fn csp_nonce_attr(request: &Request) -> String {
if let Some(nonce) = get_csp_nonce(request) {
format!("nonce=\"{}\"", nonce)
} else {
String::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
use bytes::Bytes;
use hyper::{HeaderMap, Method, Version};
#[test]
fn test_get_csp_nonce_exists() {
let request = Request::builder()
.method(Method::GET)
.uri("/test")
.version(Version::HTTP_11)
.headers(HeaderMap::new())
.body(Bytes::new())
.build()
.unwrap();
request
.extensions
.insert(CspNonce("test-nonce-123".to_string()));
let nonce = get_csp_nonce(&request);
assert_eq!(nonce, Some("test-nonce-123".to_string()));
}
#[test]
fn test_get_csp_nonce_not_exists() {
let request = Request::builder()
.method(Method::GET)
.uri("/test")
.version(Version::HTTP_11)
.headers(HeaderMap::new())
.body(Bytes::new())
.build()
.unwrap();
let nonce = get_csp_nonce(&request);
assert_eq!(nonce, None);
}
#[test]
fn test_csp_nonce_attr_exists() {
let request = Request::builder()
.method(Method::GET)
.uri("/test")
.version(Version::HTTP_11)
.headers(HeaderMap::new())
.body(Bytes::new())
.build()
.unwrap();
request.extensions.insert(CspNonce("abc123".to_string()));
let attr = csp_nonce_attr(&request);
assert_eq!(attr, "nonce=\"abc123\"");
}
#[test]
fn test_csp_nonce_attr_not_exists() {
let request = Request::builder()
.method(Method::GET)
.uri("/test")
.version(Version::HTTP_11)
.headers(HeaderMap::new())
.body(Bytes::new())
.build()
.unwrap();
let attr = csp_nonce_attr(&request);
assert_eq!(attr, "");
}
}