en/src/router/handlers/raw.rs

65 lines
1.7 KiB
Rust

use axum::{
body::Body,
http::{header, HeaderValue, Response, StatusCode},
};
use crate::prelude::*;
pub(in crate::router::handlers) fn make_response(
body: &str,
status_code: u16,
headers: &[(header::HeaderName, &str)],
) -> Response<Body> {
let mut response = Response::new(Body::from(body.to_owned()));
*response.status_mut() = StatusCode::from_u16(status_code)
.unwrap_or(StatusCode::INTERNAL_SERVER_ERROR);
for header in headers {
if let Ok(wrapped) = HeaderValue::from_str(header.1) {
if let Some(overwritten) =
response.headers_mut().insert(header.0.clone(), wrapped)
{
log!(
"Overwrote header {overwritten:?} \
because another for key {} already existed",
header.0
);
}
} else {
log!("Failed to create header value from {}", header.1);
}
}
response
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn repeated_header() {
let headers = [
(header::ACCEPT, "Not really"),
(header::ACCEPT, "This again?"),
];
let response = make_response("", 418, &headers);
assert!(response.headers().get_all(header::ACCEPT).iter().count() == 1);
assert_eq!(
response
.headers()
.get(header::ACCEPT)
.unwrap()
.to_str()
.unwrap(),
"This again?",
);
}
#[test]
fn invalid_header() {
let response = make_response("", 418, &[(header::MAX_FORWARDS, "\n")]);
assert!(response.headers().get(header::MAX_FORWARDS).is_none());
}
}