From e40abea488d4a597f9567206b1aea542acd54b40 Mon Sep 17 00:00:00 2001
From: Darius Auding <Darius.auding@gmx.de>
Date: Fri, 19 May 2023 13:59:18 +0200
Subject: [PATCH] Reading in body of requests with body

---
 core/http/src/handlers/handlers.rs | 55 +++++++++++++++++++++++++-----
 core/http/src/handling/request.rs  |  9 +++++
 2 files changed, 55 insertions(+), 9 deletions(-)

diff --git a/core/http/src/handlers/handlers.rs b/core/http/src/handlers/handlers.rs
index 2045ee5..c0e77e3 100755
--- a/core/http/src/handlers/handlers.rs
+++ b/core/http/src/handlers/handlers.rs
@@ -1,5 +1,5 @@
 use std::{
-    io::{BufRead, BufReader, Write},
+    io::{BufRead, BufReader, Read, Write},
     net::TcpStream,
     path::PathBuf,
 };
@@ -13,12 +13,20 @@ use crate::handling::{
 use crate::setup::MountPoint;
 
 pub fn handle_connection(mut stream: TcpStream, mountpoints: Vec<MountPoint>) {
-    let buf_reader = BufReader::new(&mut stream);
-    let http_request: Vec<String> = buf_reader
-        .lines()
-        .map(|result| result.unwrap())
-        .take_while(|line| !line.is_empty())
-        .collect();
+    let mut buf_reader = BufReader::new(&mut stream);
+    let mut http_request: Vec<String> = vec![];
+
+    loop {
+        let mut buffer = String::new();
+        let _ = buf_reader.read_line(&mut buffer).unwrap();
+        if buffer == "\r\n" {
+            break;
+        }
+        http_request.push(buffer);
+    }
+
+    println!("{:#?}", http_request);
+
     let request_status_line = http_request.get(0);
     if request_status_line == None {
         return;
@@ -35,10 +43,39 @@ pub fn handle_connection(mut stream: TcpStream, mountpoints: Vec<MountPoint>) {
             .unwrap(),
     };
 
-    let data = Data {
+    let mut data = Data {
+        is_complete: false,
         buffer: vec![],
-        is_complete: true,
     };
+    if request.can_have_body() {
+        let length = if let Some(len) = request
+            .headers
+            .iter()
+            .filter(|header| header.contains("Content-Length: "))
+            .clone()
+            .map(|header| {
+                let header = header.strip_prefix("Content-Length: ").unwrap();
+                header.trim().parse::<usize>()
+            })
+            .next()
+        {
+            if let Ok(size) = len {
+                size
+            } else {
+                0
+            }
+        } else {
+            0
+        };
+        let mut buffer: Vec<u8> = vec![0; length];
+        let read_len = buf_reader.read(&mut buffer).unwrap();
+        if read_len != length {
+            eprintln!("User inputted invalid BUFLEN");
+            return;
+        }
+        data.is_complete = true;
+        data.buffer = buffer;
+    }
 
     let mut handled_response: Option<Outcome<Response, Status, Data>> = None;
     for mountpoint in mountpoints {
diff --git a/core/http/src/handling/request.rs b/core/http/src/handling/request.rs
index d37ebb5..ba1cf37 100644
--- a/core/http/src/handling/request.rs
+++ b/core/http/src/handling/request.rs
@@ -22,3 +22,12 @@ pub enum MediaType {
     Plain,
     Html,
 }
+
+impl Request<'_> {
+    pub fn can_have_body(&self) -> bool {
+        match self.method {
+            Method::Post | Method::Put | Method::Patch | Method::Delete => true,
+            _ => false,
+        }
+    }
+}
-- 
GitLab