From 4ce93172a7a2bc06b984ddf2fadbfb17bbf204e6 Mon Sep 17 00:00:00 2001 From: Kjetil Orbekk Date: Sun, 18 Jun 2017 09:22:16 -0400 Subject: fix: Create working urls based on the incoming request. --- src/render/mod.rs | 42 ++++++++++++++++++++++++------------------ src/server.rs | 9 +++++---- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/render/mod.rs b/src/render/mod.rs index b47ee55..9bce062 100644 --- a/src/render/mod.rs +++ b/src/render/mod.rs @@ -5,10 +5,15 @@ use horrorshow::Raw; #[derive(Debug)] pub struct Renderer { + pub base_url: String, pub user: Option, } impl Renderer { + fn get_url(&self, path: &str) -> String { + format!("{}{}", self.base_url, path) + } + fn render_in_page<'a>(&self, content: Box) -> String { info!("Rendering page with context: {:?}", self); let login_box: Box = match self.user { @@ -17,16 +22,16 @@ impl Renderer { : "Logged in as "; : user; : " ("; - a(href="logout") { // TODO get base url from context - : "log out" + a(href=self.get_url("logout")) { + : "Log out" } : ")"; } } None => { box_html! { - a(href="login") { // TODO Get base url from context - : "Login" + a(href=self.get_url("login")) { // TODO Get base url from context + : "Log in" } } } @@ -83,24 +88,25 @@ impl Renderer { }) } - fn unit_table<'a>(&self, units: &'a [&unit::Unit]) -> Box { - fn render_unit<'a>(unit: &'a unit::Unit) -> Box { - box_html! { - tr { - td { - a(href=format_args!("/status/{}", &unit.name)) { - : &unit.name - } - } - td { - : format_args!("{} ({})", - &unit.active_state, - &unit.sub_state) + fn render_unit<'a>(&'a self, unit: &'a unit::Unit) -> Box { + box_html! { + tr { + td { + a(href=self.get_url(&format!("/status/{}", &unit.name))) { + : &unit.name } } + td { + : format_args!("{} ({})", + &unit.active_state, + &unit.sub_state) + } } } + } + + fn unit_table<'a>(&'a self, units: &'a [&unit::Unit]) -> Box { box_html! { table { tr { @@ -112,7 +118,7 @@ impl Renderer { } } @ for unit in units { - : render_unit(unit) + : self.render_unit(unit) } } } diff --git a/src/server.rs b/src/server.rs index 58027e9..a4c2d35 100644 --- a/src/server.rs +++ b/src/server.rs @@ -147,7 +147,7 @@ fn authenticate(r: &mut Request) -> IronResult { let login = Login { user: user.to_string() }; // TODO Make a validated login type info!("User logged in: {:?}", login); r.session().set(login)?; - let url = Url::parse("http://localhost:8080/").unwrap(); + let url = url_for!(r, "root"); Ok(Response::with((status::Found, Redirect(url)))) } else { login(r) @@ -156,13 +156,14 @@ fn authenticate(r: &mut Request) -> IronResult { fn logout(r: &mut Request) -> IronResult { r.session().set::(Default::default()); - let url = Url::parse("http://localhost:8080/").unwrap(); + let url = url_for!(r, "root"); Ok(Response::with((status::Found, Redirect(url)))) } fn make_renderer(r: &mut Request) -> IronResult { let user = get_logged_in_user(r)?.map(|u| u.user); - Ok(render::Renderer { user: user }) + let base_url = format!("{}", url_for!(r, "root")); + Ok(render::Renderer { base_url: base_url, user: user }) } pub fn serve(context: Context, port: u16) -> HttpResult { @@ -175,7 +176,7 @@ pub fn serve(context: Context, port: u16) -> HttpResult { logout: get "/logout" => logout, details: get "/status/:unit" => unit_status, journal: get "/journal/:unit" => journal, - css: get "/static/main.css" => Static::new(""), + css: get "/static/main.css" => Static::new(""), // TODO: Use this instead? https://doc.rust-lang.org/std/macro.include.html ); let mut chain = Chain::new(router); chain.link_around(SessionStorage::new(SignedCookieBackend::new(secret))); -- cgit v1.2.3