From c79e7fa761196e50407c5de18977a4f9d40445c9 Mon Sep 17 00:00:00 2001 From: omagdy7 Date: Wed, 5 Jun 2024 20:56:37 +0300 Subject: feat: Added basic handling of Content-Encoding header --- src/server.rs | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/utils.rs | 22 +++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 src/server.rs create mode 100644 src/utils.rs (limited to 'src') diff --git a/src/server.rs b/src/server.rs new file mode 100644 index 0000000..c0d7ab6 --- /dev/null +++ b/src/server.rs @@ -0,0 +1,69 @@ +use std::io::{self, Read, Write}; +use std::net::TcpStream; +use std::str; +use std::{ + collections::HashMap, + net::{SocketAddr, TcpListener}, +}; + +use crate::request::Request; +use crate::router::Router; + +pub struct Server { + address: SocketAddr, +} + +impl Server { + pub fn new(address: SocketAddr) -> Self { + Self { address } + } + + pub fn handle_client( + mut stream: TcpStream, + router: &Router, + ctx: Option<&HashMap>, + ) -> io::Result { + // Buffer to store the data received from the client + let mut buffer = [0; 512]; + + // Read data from the stream + match stream.read(&mut buffer) { + Ok(_) => { + // Convert buffer to a string and print the received data + match str::from_utf8(&buffer) { + Ok(request) => { + println!("Received request:\n{}", request); + let request_lines: Vec<&str> = request.split("\r\n").collect(); + let request = Request::from(request_lines); + let request_string: String = (&request).into(); + + println!("Request after parsing:\n{}", request_string); + dbg!(&request.method); + + let response: String = router.handle(&request, ctx).into(); + stream.write(response.as_bytes()) + } + Err(_) => todo!(), + } + } + Err(_) => todo!(), + } + } + + pub fn serve(&self, router: &Router, ctx: Option<&HashMap>) -> io::Result<()> { + let listener = TcpListener::bind(self.address).unwrap(); + for stream in listener.incoming() { + match stream { + Ok(stream) => { + // thread::spawn(|| { + let _ = Server::handle_client(stream, router, ctx); + // }); + } + Err(e) => { + eprintln!("error: {}", e); + } + } + } + Ok(()) + } +} diff --git a/src/utils.rs b/src/utils.rs new file mode 100644 index 0000000..e9d2ef1 --- /dev/null +++ b/src/utils.rs @@ -0,0 +1,22 @@ +use std::fs::File; +use std::io::{self, Read, Write}; + +pub fn save_bytes_to_file(bytes: &[u8], file_path: &str) -> io::Result<()> { + let mut file = File::create(file_path)?; + file.write_all(bytes)?; + Ok(()) +} + +pub fn read_file_as_bytes(path: &str) -> io::Result> { + // Open the file in read-only mode + let mut file = File::open(path)?; + + // Create a buffer to hold the file contents + let mut buffer = Vec::new(); + + // Read the file contents into the buffer + file.read_to_end(&mut buffer)?; + + // Return the buffer + Ok(buffer) +} -- cgit v1.2.3