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::{
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 {
......
......@@ -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,
}
}
}
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