From: Erik Mackdanz Date: Fri, 27 Oct 2023 00:24:37 +0000 (-0500) Subject: macro for readability X-Git-Url: https://git.humopery.space/?a=commitdiff_plain;h=57e510014b67abcb1b828e2d193568e41067489d;p=fcgisrv.git macro for readability --- diff --git a/src/main.rs b/src/main.rs index 7a3cb8d..f89a17a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,6 +11,19 @@ use signal::Signal; const BUFSZ: usize = 4096; +macro_rules! write_err_resp { + ($req:expr,$status:expr,$statusmess:expr,$body:expr) => { + if let Err(e) = + write!(&mut $req.stdout(),"Status: {} {}\n\ + Content-Type: {}\n\n\ + {}\n", + $status,$statusmess,"text/plain",$body) + { + println!("Error was {}",e); + } + } +} + fn handle_req(mut req: Request) { // for (k,v) in req.params() { // println!("key {} has value {}",k,v); @@ -18,23 +31,21 @@ fn handle_req(mut req: Request) { // require a method let Some(method) = req.param("REQUEST_METHOD") else { - if let Err(e) = write!(&mut req.stdout(), "Status: 405 Method Not Allowed\nContent-Type: text/plain\n\nNo method") { - println!("Error was {}",e); - } + write_err_resp!(req,"405","Method not allowed","No method"); return; }; // require method is GET if method != "GET" { - if let Err(e) = write!(&mut req.stdout(), "Status: 405 Method Not Allowed\nContent-Type: text/plain\n\nBad method") { - println!("Error was {}",e); - } + write_err_resp!(req,"405","Method not allowed","Bad method"); return; }; // require a filename let Some(filename) = req.param("SCRIPT_FILENAME") else { - if let Err(e) = write!(&mut req.stdout(), "Status: 400 Bad Request\nContent-Type: text/plain\n\nNo filename sent") { - println!("Error was {}",e); - } + write_err_resp!(req,"400","Bad Request","No filename sent"); + return; + }; + if filename.ends_with("/") { + write_err_resp!(req,"400","Bad Request","No filename sent"); return; }; @@ -45,21 +56,18 @@ fn handle_req(mut req: Request) { // read std::fs::metadata including size let Ok(metadata) = metadata(filename.clone()) else { - if let Err(e) = write!(&mut req.stdout(), "Status: 400 Bad Request\nContent-Type: text/plain\n\nfile metadata can't be read") { - println!("Error was {}",e); - } + write_err_resp!(req,"400","Bad Request","File metadata can't be read"); return; }; - println!("len: {}, perms: {:?}, mime: {}",metadata.len(),metadata.permissions(),mimestr); + println!("len: {}, perms: {:?}, mime: {}", + metadata.len(),metadata.permissions(),mimestr); // std::fs::read to one large buffer let mut buf = [0; BUFSZ]; let Ok(mut f) = File::open(filename) else { - if let Err(e) = write!(&mut req.stdout(), "Status: 500 Server Error\nContent-Type: text/plain\n\ncan't open file") { - println!("Error was {}",e); - } + write_err_resp!(req,"500","Server Error","Can't open file"); return; }; @@ -67,7 +75,8 @@ fn handle_req(mut req: Request) { while let Ok(n) = f.read(&mut buf) { if is_first_write { - if let Err(e) = write!(&mut req.stdout(), "Content-Type: {}\nContent-Length: {}\n\n", + if let Err(e) = write!(&mut req.stdout(), + "Content-Type: {}\nContent-Length: {}\n\n", mimestr,metadata.len()) { println!("Error was {}",e); }