From 0de7d2f2cc1856d01e810c76058d3c5f685a24af Mon Sep 17 00:00:00 2001 From: Stanisław Zagórowski Date: Thu, 11 Jan 2024 17:04:12 +0100 Subject: status codes --- src/server.rs | 46 ++++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 20 deletions(-) (limited to 'src/server.rs') diff --git a/src/server.rs b/src/server.rs index 106f9f8..7e27a39 100644 --- a/src/server.rs +++ b/src/server.rs @@ -7,7 +7,7 @@ use http_body_util::Full; use hyper::body::{Bytes, Incoming}; use hyper::server::conn::http1; use hyper::service::Service; -use hyper::{Request, Response}; +use hyper::{Request, Response, StatusCode}; use hyper_util::rt::TokioIo; use tokio::net::TcpListener; @@ -26,10 +26,10 @@ struct State { } impl Server { - pub async fn serve(port: u16) -> Result<()> { + pub async fn serve(lua: Lua, port: u16) -> Result<()> { let server = Self { port, - lua: Arc::new(Mutex::new(Lua::new())), + lua: Arc::new(Mutex::new(lua)), }; server.start().await } @@ -45,18 +45,18 @@ impl Server { lua: self.lua.clone(), }; tokio::task::spawn(async move { - tokio::task::spawn(async move { - if let Err(err) = http1::Builder::new().serve_connection(io, state).await { - println!("Failed to serve connection: {:?}", err); - } - }); + if let Err(err) = http1::Builder::new().serve_connection(io, state).await { + println!("Failed to serve connection: {:?}", err); + } }); } } } -fn mk_response(s: String) -> Result>> { - Ok(Response::builder().body(Full::new(Bytes::from(s))).unwrap()) +fn mk_response(status: StatusCode, s: String) -> Result>> { + Ok(Response::builder() + .status(status) + .body(Full::new(Bytes::from(s)))?) } impl Service> for State { @@ -67,33 +67,39 @@ impl Service> for State { fn call(&self, req: Request) -> Self::Future { let path = req.uri().path(); - let res = self.serve(path).map(mk_response).unwrap_or_else(|err| { - println!("Error: {}", err); - Err(err) - }); + let res = self + .serve(path) + .map(|(st, s)| mk_response(st, s)) + .unwrap_or_else(|err| { + println!("Error: {}", err); + Err(err) + }); Box::pin(async { res }) } } impl State { - fn serve(&self, path: &str) -> Result { + fn serve(&self, path: &str) -> Result<(StatusCode, String)> { let lua = self.lua.lock().unwrap(); - let res = lua.context(|ctx| -> Result { + let res = lua.context(|ctx| -> Result<(StatusCode, String)> { let manifest: rlua::Table = ctx.load("require('reluax')").eval()?; let route: rlua::Function = manifest.get("route")?; - let res: rlua::Value = route.call((path,))?; + let res: (rlua::Integer, rlua::Value) = route.call((path,))?; + + let status = + StatusCode::from_u16(res.0 as u16).unwrap_or(StatusCode::INTERNAL_SERVER_ERROR); - match res { - rlua::Value::String(s) => Ok(s.to_str()?.to_string()), + match res.1 { + rlua::Value::String(s) => Ok((status, s.to_str()?.to_string())), rlua::Value::Table(t) => { let mut buf = Vec::new(); table_to_html(t, &mut buf)?; let s = String::from_utf8(buf).unwrap(); - Ok(s) + Ok((status, s)) } rlua::Value::Nil => Err(ReluaxError::Server("No route found".to_string()).into()), rlua::Value::Error(e) => Err(ReluaxError::Lua(e).into()), -- cgit v1.3.1