| 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); |
| } |
| } |
| } |
| } |