Skip to content
Snippets Groups Projects
Commit e40abea4 authored by codecraft's avatar codecraft :crocodile:
Browse files

Reading in body of requests with body

parent 3eca9706
No related branches found
No related tags found
1 merge request!1Initial feature merge
use std::{ use std::{
io::{BufRead, BufReader, Write}, io::{BufRead, BufReader, Read, Write},
net::TcpStream, net::TcpStream,
path::PathBuf, path::PathBuf,
}; };
...@@ -13,12 +13,20 @@ use crate::handling::{ ...@@ -13,12 +13,20 @@ use crate::handling::{
use crate::setup::MountPoint; use crate::setup::MountPoint;
pub fn handle_connection(mut stream: TcpStream, mountpoints: Vec<MountPoint>) { pub fn handle_connection(mut stream: TcpStream, mountpoints: Vec<MountPoint>) {
let buf_reader = BufReader::new(&mut stream); let mut buf_reader = BufReader::new(&mut stream);
let http_request: Vec<String> = buf_reader let mut http_request: Vec<String> = vec![];
.lines()
.map(|result| result.unwrap()) loop {
.take_while(|line| !line.is_empty()) let mut buffer = String::new();
.collect(); 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); let request_status_line = http_request.get(0);
if request_status_line == None { if request_status_line == None {
return; return;
...@@ -35,10 +43,39 @@ pub fn handle_connection(mut stream: TcpStream, mountpoints: Vec<MountPoint>) { ...@@ -35,10 +43,39 @@ pub fn handle_connection(mut stream: TcpStream, mountpoints: Vec<MountPoint>) {
.unwrap(), .unwrap(),
}; };
let data = Data { let mut data = Data {
is_complete: false,
buffer: vec![], 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; let mut handled_response: Option<Outcome<Response, Status, Data>> = None;
for mountpoint in mountpoints { for mountpoint in mountpoints {
......
...@@ -22,3 +22,12 @@ pub enum MediaType { ...@@ -22,3 +22,12 @@ pub enum MediaType {
Plain, Plain,
Html, Html,
} }
impl Request<'_> {
pub fn can_have_body(&self) -> bool {
match self.method {
Method::Post | Method::Put | Method::Patch | Method::Delete => true,
_ => false,
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment