use crate::Request;
pub fn parse_headers(buffer: [u8; 1024], n: usize) -> Request {
let request = &buffer[..n];
let mut headers: Vec<&[u8]> = Vec::new();
let mut current_header_start = 0;
for i in 0..n - 1 {
if request[i] == b'\r' && i + 1 < request.len() && request[i + 1] == b'\n' {
headers.push(&request[current_header_start..=i]);
current_header_start = i + 2;
}
if request[i] == b'\n' {
headers.push(&request[current_header_start..=i]);
current_header_start = i + 1;
}
if request[i] == b'\r'
&& i + 3 < request.len()
&& request[i + 1] == b'\n'
&& request[i + 2] == b'\r'
&& request[i + 3] == b'\n'
{
break;
}
if request[i] == b'\n' && i + 1 < request.len() && request[i + 1] == b'\n' {
break;
}
}
let mut method: &'static str = "POST";
let mut path: &'static str = "";
let mut get_request: &'static str = "";
let mut protocol: &'static str = "";
let mut keep_alive = false;
let mut request_was_correct = true;
for i in headers {
let line_of_header = String::from_utf8(i.to_vec());
match line_of_header {
Ok(line_of_header) => {
let our_line = line_of_header.trim().to_lowercase();
if our_line.starts_with("get") {
method = "GET";
let tokens = our_line
.clone()
.leak()
.split_whitespace()
.collect::<Vec<&str>>(); if tokens.len() > 1 {
if tokens[1].contains('?') {
let parts: Vec<&str> = tokens[1].split('?').collect();
if parts[0].as_bytes()[parts[0].len() - 1] == "/".as_bytes()[0]
&& parts[0] != "/"
{
path = &parts[0][..parts[0].len() - 1];
} else {
path = parts[0];
}
if parts.len() > 1 {
get_request = parts[1];
}
} else if tokens[1].as_bytes()[tokens[1].len() - 1] == "/".as_bytes()[0]
&& tokens[1] != "/"
{
path = &tokens[1][..tokens[1].len() - 1];
} else {
path = tokens[1];
}
}
if tokens.len() > 2 {
protocol = tokens[2];
}
}
if our_line.starts_with("connection")
&& our_line.len() > 11
&& our_line.contains("keep-alive")
{
keep_alive = true;
}
}
Err(_) => {
request_was_correct = false;
}
}
}
Request {
method,
path,
get_request,
keep_alive,
protocol,
request_was_correct,
}
}