From 16ed59d53024784f5eeeff31591562e4cc9f2d29 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Thu, 27 Mar 2025 21:02:09 +0100 Subject: http/1.1 --- server/respack_http/src/main.rs | 51 ++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/server/respack_http/src/main.rs b/server/respack_http/src/main.rs index be703bd..967c3c4 100644 --- a/server/respack_http/src/main.rs +++ b/server/respack_http/src/main.rs @@ -42,36 +42,35 @@ fn main() -> Result<()> { fn handle_conn(conn: TcpStream, store: Arc) -> Result<()> { let mut conn_read = BufReader::new(conn.try_clone()?); let mut conn_write = BufWriter::new(conn); + loop { + let mut buf = String::new(); + while !buf.ends_with("\r\n\r\n") { + conn_read.read_line(&mut buf)?; + } - let mut buf = String::new(); - while !buf.ends_with("\r\n\r\n") { - conn_read.read_line(&mut buf)?; - } - - let mut lines = buf.lines(); - let mut status = lines - .next() - .ok_or(anyhow!("HTTP status line missing"))? - .split(" "); - let _method = status.next().ok_or(anyhow!("HTTP method missing"))?; - let path = status.next().ok_or(anyhow!("HTTP path missing"))?; - let _httpver = status.next().ok_or(anyhow!("HTTP version missing"))?; - - let path = path - .strip_prefix("/") - .ok_or(anyhow!("path does not start on /"))?; + let mut lines = buf.lines(); + let mut status = lines + .next() + .ok_or(anyhow!("HTTP status line missing"))? + .split(" "); + let _method = status.next().ok_or(anyhow!("HTTP method missing"))?; + let path = status.next().ok_or(anyhow!("HTTP path missing"))?; + let _httpver = status.next().ok_or(anyhow!("HTTP version missing"))?; - let (code, ty, data) = handle_request(path, &store); + let path = path + .strip_prefix("/") + .ok_or(anyhow!("path does not start on /"))?; - write!(conn_write, "HTTP/1.0 {code} OK\r\n")?; - write!(conn_write, "content-type: {ty}\r\n")?; - write!(conn_write, "server: write! macros\r\n")?; - write!(conn_write, "content-length: {}\r\n", data.len())?; - write!(conn_write, "\r\n")?; - conn_write.write_all(&data)?; - conn_write.flush()?; + let (code, ty, data) = handle_request(path, &store); - Ok(()) + write!(conn_write, "HTTP/1.1 {code} OK\r\n")?; + write!(conn_write, "content-type: {ty}\r\n")?; + write!(conn_write, "server: write! macros\r\n")?; + write!(conn_write, "content-length: {}\r\n", data.len())?; + write!(conn_write, "\r\n")?; + conn_write.write_all(&data)?; + conn_write.flush()?; + } } fn handle_request(path: &str, store: &ResourceStore) -> (u16, &'static str, Vec) { -- cgit v1.2.3-70-g09d2