blob: 26d1433bfac47bb78d8ff179ad8de8129c59a33a [file] [log] [blame]
use std::{net::TcpListener, io::{Write, Read}};
use itertools::Itertools;
fn main() {
let listener = TcpListener::bind("127.0.0.1:4221").unwrap();
for stream in listener.incoming() {
match stream {
Ok(mut _stream) => {
println!("accepted new connection");
let mut request: Vec<Vec<char>> = vec![vec![]];
let mut part: usize = 0;
loop {
let mut buf: [u8; 1] = [0; 1];
_stream.read_exact(&mut buf).unwrap();
if buf[0] == b' ' {
part += 1;
request.push(vec![]);
} else {
request[part].push(buf[0].into());
}
if part == 2 {
break;
}
}
let unparsed_path = request[1].iter().collect::<String>();
let mut path = unparsed_path.split("/");
let response_status: String;
let mut response_headers: Vec<String> = vec![];
let response_body: String;
// println!("{:?}", path);
// println!("{:?}", path);
path.next().unwrap();
match path.next().unwrap() {
"" => {
response_status = "200 OK".to_owned();
response_body = "".to_owned();
},
"echo" => {
response_status = "200 OK".to_owned();
response_body = path.join("/");
response_headers.push("Content-Type: text/plain".to_owned());
response_headers.push(format!("Content-Length: {}", response_body.len()));
},
_ => {
response_status = "404 Not Found".to_owned();
response_body = "".to_owned();
}
}
_stream.write(format!("HTTP/1.1 {response_status}\r\n{}\r\n\r\n{response_body}\r\n", response_headers.join("\r\n")).as_bytes()).unwrap();
}
Err(e) => {
println!("error: {}", e);
}
}
}
}