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