From 7ea4e667ed9d0f91d6970d8545f396bf3546f2d3 Mon Sep 17 00:00:00 2001 From: dqnid Date: Thu, 21 Nov 2024 23:56:14 +0100 Subject: [PATCH] feat(HTTP): server basic responses + minor organization --- docs/TODO.md | 9 +++++++++ index.html | 11 +++++++++++ src/http.rs | 38 ++++++++++++++++++++++++++++++++++++++ src/main.rs | 35 +++++++++++++++++++++-------------- 4 files changed, 79 insertions(+), 14 deletions(-) create mode 100644 docs/TODO.md create mode 100644 index.html create mode 100644 src/http.rs diff --git a/docs/TODO.md b/docs/TODO.md new file mode 100644 index 0000000..81bea3f --- /dev/null +++ b/docs/TODO.md @@ -0,0 +1,9 @@ +# TODO +- [ ] Router +- [ ] HTTP code mapper +- [ ] JS / CSS data +- [ ] Media manager +- [ ] Log system + - [ ] File management + - [ ] Auto-cleanup + - [ ] Transversal utility diff --git a/index.html b/index.html new file mode 100644 index 0000000..b04c8ca --- /dev/null +++ b/index.html @@ -0,0 +1,11 @@ + + + + + + Document + + + HEY! + + diff --git a/src/http.rs b/src/http.rs new file mode 100644 index 0000000..7ec9c5c --- /dev/null +++ b/src/http.rs @@ -0,0 +1,38 @@ +use std::fs; +use std::io::prelude::*; +use std::net::TcpStream; + +pub struct ProcessedResponse { + pub data: String, + status: u8, +} + +pub fn process_petition(stream: &mut TcpStream) -> std::io::Result { + let mut buffer = [0; 1024]; + + let _amount = stream.read(&mut buffer)?; + + let petition = String::from_utf8_lossy(&buffer[..]); + + let petition = petition.split("\n"); + + for line in petition { + println!("PART: {}", line) + } + + let response_status = "200 OK"; + + let response_content = fs::read_to_string("./index.html").unwrap(); + + let response: ProcessedResponse = ProcessedResponse { + data: format!( + "HTTP/1.1 {}\r\nContent-Length: {}\r\n\r\n{}", + response_status, + response_content.len(), + response_content + ), + status: 200, + }; + + Ok(response) +} diff --git a/src/main.rs b/src/main.rs index 294c380..0aff297 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,17 +1,7 @@ use std::io::prelude::*; -use std::net::{SocketAddr, TcpListener, TcpStream}; +use std::net::{SocketAddr, TcpListener}; -fn handle_petition(mut stream: TcpStream) -> std::io::Result<()> { - let mut buffer = [0; 1024]; - - let amount = stream.read(&mut buffer)?; - - println!( - "Request: {} of {amount} bytes", - String::from_utf8_lossy(&buffer[..]) - ); - Ok(()) -} +mod http; fn main() { let addr = SocketAddr::from(([127, 0, 0, 1], 80)); @@ -21,8 +11,25 @@ fn main() { println!("Server up and running!"); for stream in listener.incoming() { - let _stream = stream.unwrap(); + let mut _stream = stream.unwrap(); println!("Connection established!"); - let _result = handle_petition(_stream); + let response = http::process_petition(&mut _stream); + + // TODO: manage error case + match response { + Ok(data) => { + let _amount = _stream.write(data.data.as_bytes()).unwrap(); + } + Err(e) => { + println!("Error: {:?}", e); + let _amount = _stream + .write( + "HTTP/1.1 500 Internal Server Error\r\nContent-Length: 0\r\n\r\n" + .as_bytes(), + ) + .unwrap(); + } + } + _stream.flush().unwrap(); } }