summaryrefslogtreecommitdiff
path: root/server/respack_http/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/respack_http/src/main.rs')
-rw-r--r--server/respack_http/src/main.rs51
1 files 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<ResourceStore>) -> 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<u8>) {