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