]> Humopery - fcgisrv.git/commitdiff
macro for readability
authorErik Mackdanz <erikmack@gmail.com>
Fri, 27 Oct 2023 00:24:37 +0000 (19:24 -0500)
committerErik Mackdanz <erikmack@gmail.com>
Fri, 27 Oct 2023 00:24:37 +0000 (19:24 -0500)
src/main.rs

index 7a3cb8dce3b563147e961b1367be6fe11b20aab3..f89a17a68dc36c2d03d9251e3cf9777dbe2ffbb8 100644 (file)
@@ -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);
            }