summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKjetil Orbekk <kjetil.orbekk@gmail.com>2017-06-18 09:22:16 -0400
committerKjetil Orbekk <kjetil.orbekk@gmail.com>2017-06-18 09:22:16 -0400
commit4ce93172a7a2bc06b984ddf2fadbfb17bbf204e6 (patch)
tree547e90fc221e39a2963e252966bc48d19f12032e
parentc6c2f0929dd7bb0ec64373c40309a27e659624b5 (diff)
fix: Create working urls based on the incoming request.
-rw-r--r--src/render/mod.rs42
-rw-r--r--src/server.rs9
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<String>,
}
impl Renderer {
+ fn get_url(&self, path: &str) -> String {
+ format!("{}{}", self.base_url, path)
+ }
+
fn render_in_page<'a>(&self, content: Box<RenderBox + 'a>) -> String {
info!("Rendering page with context: {:?}", self);
let login_box: Box<RenderBox> = 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<RenderBox + 'a> {
- fn render_unit<'a>(unit: &'a unit::Unit) -> Box<RenderBox + 'a> {
- 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<RenderBox + 'a> {
+ 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<RenderBox + 'a> {
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<Response> {
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<Response> {
fn logout(r: &mut Request) -> IronResult<Response> {
r.session().set::<Login>(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<render::Renderer> {
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<Listening> {
@@ -175,7 +176,7 @@ pub fn serve(context: Context, port: u16) -> HttpResult<Listening> {
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)));