From 21a170df00884fcb1d93f7352757149829bc89c2 Mon Sep 17 00:00:00 2001 From: Darius Auding <Darius.auding@gmx.de> Date: Mon, 29 May 2023 17:11:18 +0200 Subject: [PATCH] Add HEAD Method support --- core/http/src/handlers/handlers.rs | 11 ++++++++--- site/src/main.rs | 9 +++++++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/core/http/src/handlers/handlers.rs b/core/http/src/handlers/handlers.rs index d9ba8df..f81441c 100755 --- a/core/http/src/handlers/handlers.rs +++ b/core/http/src/handlers/handlers.rs @@ -6,7 +6,7 @@ use crate::handling::{ file_handlers::NamedFile, request::Request, response::{Outcome, Response, ResponseBody, Status}, - routes::Data, + routes::Data, methods::Method, }; use crate::setup::MountPoint; @@ -103,7 +103,8 @@ pub async fn handle_connection(mut stream: TcpStream, mountpoints: Vec<MountPoin } let mounted_request_uri = request.uri.strip_prefix(mountpoint.mountpoint).unwrap(); for route in mountpoint.routes { - if route.method != request.method { + if (route.method != request.method) && + ((route.method != Method::Get) && (request.method == Method::Head)) { continue; } if !route.compare_uri(mounted_request_uri) { @@ -130,7 +131,11 @@ pub async fn handle_connection(mut stream: TcpStream, mountpoints: Vec<MountPoin format!("HTTP/1.1 {}\r\n", success.status.unwrap_or(Status::Ok)) + &success.headers.join("\r\n") + "\r\n\r\n", - success.body.get_data(), + if request.method == Method::Head { + vec![] + } else { + success.body.get_data() + } ), Outcome::Failure(error) => failure_handler(error), Outcome::Forward(_) => failure_handler(Status::NotFound), diff --git a/site/src/main.rs b/site/src/main.rs index 48d109d..6e560d4 100644 --- a/site/src/main.rs +++ b/site/src/main.rs @@ -20,8 +20,13 @@ fn hashmap_to_string(map: &HashMap<&str, &str>) -> String { result } -fn handle_static_hi(request: Request<'_>, _data: Data) -> Outcome<Response, Status, Data> { - let response = hashmap_to_string(&request.get_form_keys(vec!["asdf", "jkj"]).unwrap()); +fn handle_static_hi(request: Request<'_>, data: Data) -> Outcome<Response, Status, Data> { + let keys = if let Ok(keys) = request.get_form_keys(vec!["asdf", "jkl;"]) { + keys + } else { + return Outcome::Forward(data); + }; + let response = hashmap_to_string(&keys); Outcome::Success(Response { headers: vec![ format!("Content-Length: {}", response.len()), -- GitLab