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);
// 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;
};
// 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;
};
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);
}