From 320a93118f30c6c9df6a88be0f0cb418aa222157 Mon Sep 17 00:00:00 2001 From: maxstrb Date: Mon, 6 Oct 2025 07:35:34 +0200 Subject: [PATCH] reading lines --- src/main.rs | 7 ++++--- src/request.rs | 54 ++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index 781d707..d679fbd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,7 +3,7 @@ mod response; mod shared_enums; use std::{ - io::{BufRead, BufReader, Write}, + io::{BufReader, Write}, net::TcpListener, }; @@ -12,8 +12,9 @@ fn main() -> std::io::Result<()> { for incoming_stream in listener.incoming() { let stream = incoming_stream?; - let mut reader = BufReader::new(&stream); - let mut line = Vec::::new(); + let reader = BufReader::new(&stream); + + let req = request::Request::from_bufreader(reader)?; let mut writer = stream; writer.write_all("Ok".as_bytes())?; diff --git a/src/request.rs b/src/request.rs index 8d761c0..1358151 100644 --- a/src/request.rs +++ b/src/request.rs @@ -1,7 +1,16 @@ use crate::shared_enums::ContentType; +use std::{ + io::{self, BufRead, BufReader, Read}, + net::TcpStream, +}; + +const MAX_LINE_WIDTH: u64 = 4096; // 4 KiB +const MAX_BODY_LENGTH: u64 = 8388608; // 5 MiB pub struct Request { - first_line: String, + method: Method, + http_version: String, + path: ServerPath, headers: Vec, data: Vec, } @@ -15,5 +24,46 @@ pub enum RequestHeader { } impl Request { - fn from_bufreader + pub fn from_bufreader(buffer: BufReader<&TcpStream>) -> io::Result { + let mut first_line = Vec::::new(); + + let mut limited_buffer = buffer.take(MAX_LINE_WIDTH); + limited_buffer.read_until(b'\n', &mut first_line)?; + + println!("{}", String::from_utf8_lossy(&first_line)); + first_line.clear(); + + limited_buffer.set_limit(MAX_LINE_WIDTH); + limited_buffer.read_until(b'\n', &mut first_line)?; + + println!("{}", String::from_utf8_lossy(&first_line)); + + Ok(Self { + method: Method::Get, + http_version: "HTTP/1.1".to_string(), + path: ServerPath { + path: vec![], + options: vec![], + }, + headers: vec![], + data: vec![], + }) + } +} + +pub struct ServerPath { + path: Vec, + options: Vec<(String, String)>, +} + +pub enum Method { + Get, + Post, + Connect, + Delete, + Head, + Options, + Patch, + Put, + Trace, }