From f054c8cdda6d0e08e7b6db2368a60ac58b06a126 Mon Sep 17 00:00:00 2001 From: Adithya KP Date: Fri, 27 Mar 2026 08:56:40 +0530 Subject: [PATCH] Fix: resolve local preview server keep-alive hang by spawning per-connection threads --- xtask/src/main.rs | 68 ++++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 28 deletions(-) diff --git a/xtask/src/main.rs b/xtask/src/main.rs index 5295bdd..ddc8bf0 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -361,34 +361,46 @@ fn cmd_serve() { for stream in listener.incoming() { let Ok(mut stream) = stream else { continue }; - let mut buf = [0u8; 4096]; - let n = stream.read(&mut buf).unwrap_or(0); - let request = String::from_utf8_lossy(&buf[..n]); - - let path = request - .lines() - .next() - .and_then(|line| line.split_whitespace().nth(1)) - .unwrap_or("/"); - - if let Some(file_path) = resolve_site_file(&site_canon, path) { - let body = fs::read(&file_path).unwrap_or_default(); - let mime = guess_mime(&file_path); - let header = format!( - "HTTP/1.1 200 OK\r\nContent-Type: {mime}\r\nContent-Length: {}\r\n\r\n", - body.len() - ); - let _ = stream.write_all(header.as_bytes()); - let _ = stream.write_all(&body); - } else { - let body = b"404 Not Found"; - let header = format!( - "HTTP/1.1 404 Not Found\r\nContent-Length: {}\r\n\r\n", - body.len() - ); - let _ = stream.write_all(header.as_bytes()); - let _ = stream.write_all(body); - } + + // Clone the pathbuf so we can move it into the thread + let site_canon = site_canon.clone(); + + std::thread::spawn(move || { + let mut buf = [0u8; 4096]; + let n = stream.read(&mut buf).unwrap_or(0); + let request = String::from_utf8_lossy(&buf[..n]); + + let path = request + .lines() + .next() + .and_then(|line| line.split_whitespace().nth(1)) + .unwrap_or("/"); + + if let Some(file_path) = resolve_site_file(&site_canon, path) { + let body = std::fs::read(&file_path).unwrap_or_default(); + let mime = guess_mime(&file_path); + + // ADDED: Connection: close + let header = format!( + "HTTP/1.1 200 OK\r\nContent-Type: {mime}\r\nContent-Length: {}\r\nConnection: close\r\n\r\n", + body.len() + ); + + let _ = stream.write_all(header.as_bytes()); + let _ = stream.write_all(&body); + } else { + let body = b"404 Not Found"; + + // ADDED: Connection: close + let header = format!( + "HTTP/1.1 404 Not Found\r\nContent-Length: {}\r\nConnection: close\r\n\r\n", + body.len() + ); + + let _ = stream.write_all(header.as_bytes()); + let _ = stream.write_all(body); + } + }); } }