diff --git a/src/caching.rs b/src/caching.rs new file mode 100644 index 000000000..f40458bee --- /dev/null +++ b/src/caching.rs @@ -0,0 +1,40 @@ +use rocket::http::hyper::header::{CacheControl, CacheDirective}; +use rocket::request::Request; +use rocket::response::{self, Responder}; + +pub struct Cached { + inner: R, + directives: Vec, +} + +impl<'r, R> Responder<'r> for Cached +where + R: Responder<'r>, +{ + fn respond_to(self, req: &Request) -> response::Result<'r> { + let Cached { inner, directives } = self; + inner.respond_to(req).map(|mut res| { + res.set_header(CacheControl(directives)); + res + }) + } +} + +pub trait Caching +where + Self: Sized, +{ + fn cached(self, directives: Vec) -> Cached; +} + +impl<'r, R> Caching for R +where + R: Responder<'r>, +{ + fn cached(self, directives: Vec) -> Cached { + Cached { + inner: self, + directives: directives, + } + } +} diff --git a/src/main.rs b/src/main.rs index 76fe2699f..621ebd148 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,6 +22,7 @@ extern crate regex; extern crate handlebars; mod cache; +mod caching; mod category; mod headers; mod i18n; @@ -50,7 +51,9 @@ use sass_rs::{compile_file, Options}; use category::Category; +use caching::{Cached, Caching}; use i18n::{I18NHelper, SupportedLocale, TeamHelper}; +use rocket::http::hyper::header::CacheDirective; #[derive(Serialize)] struct Context { @@ -87,13 +90,17 @@ fn components(_file: PathBuf) -> Template { } #[get("/logos/", rank = 1)] -fn logos(file: PathBuf) -> Option { - NamedFile::open(Path::new("static/logos").join(file)).ok() +fn logos(file: PathBuf) -> Option> { + NamedFile::open(Path::new("static/logos").join(file)) + .ok() + .map(|file| file.cached(vec![CacheDirective::MaxAge(3600)])) } #[get("/static/", rank = 1)] -fn files(file: PathBuf) -> Option { - NamedFile::open(Path::new("static/").join(file)).ok() +fn files(file: PathBuf) -> Option> { + NamedFile::open(Path::new("static/").join(file)) + .ok() + .map(|file| file.cached(vec![CacheDirective::MaxAge(3600)])) } #[get("/")]