+pub use std::io;
+
+pub use thiserror::Error;
+pub use anyhow::{Context,anyhow};
+
pub use serde::Deserialize;
pub use serde::Serialize;
pub use serde::Serializer;
pub use rocket_contrib::helmet::*;
pub use rocket_contrib::templates::Template;
-pub type E = anyhow::Error;
+pub use rocket::State;
+pub use rocket::http::{Status,RawStr};
+pub use rocket::request::{FromParam,FromRequest,FromFormValue,LenientForm};
+pub use rocket::response::NamedFile;
+pub type E = anyhow::Error;
extern crate rocket_contrib; // why do we need this ?
extern crate serde;
+extern crate thiserror;
+extern crate anyhow;
mod imports;
use imports::*;
Ok(Template::render("test",&c))
}
+const RESOURCES : &[&'static str] = &["script.js", "style.css"];
+
+#[derive(Debug)]
+struct CheckedResourceLeaf { pub safe : &'static str }
+#[derive(Error,Debug)]
+#[error("not a valid resource path")]
+struct UnknownResource{}
+
+impl<'r> FromParam<'r> for CheckedResourceLeaf {
+ type Error = UnknownResource;
+ fn from_param(param: &'r RawStr) -> Result<Self, Self::Error> {
+ for &safe in RESOURCES {
+ if safe == param.as_str() { return Ok(CheckedResourceLeaf{ safe }) }
+ }
+ Err(UnknownResource{})
+ }
+}
+
+#[get("/<leaf>")]
+fn resource(leaf : CheckedResourceLeaf) -> io::Result<NamedFile> {
+ let template_dir = "templates"; // xxx
+ NamedFile::open(format!("{}/{}", template_dir, leaf.safe))
+}
+
fn main() {
let helmet = SpaceHelmet::default()
.enable(NoSniff::Enable)
.attach(helmet)
.attach(Template::fairing())
.mount("/", routes![
- index
+ index,
+ resource,
])
.launch();
}