Provide Cache-Control Headers

max-age = 1 week for everything
stale-while-revalidate = 1 day for everything except raw pastes
immutable for raw pastes

Most likely fixes #2, unless I forgot something.

Suggested-by: Leonora Tindall <ltindall@fastly.com>
Signed-off-by: Gunwant Jain <mail@wantguns.dev>
This commit is contained in:
Gunwant Jain
2022-02-07 03:05:54 +05:30
parent 884be16dc4
commit 08ec2cbecb
4 changed files with 34 additions and 9 deletions

View File

@@ -8,7 +8,8 @@ use std::time::SystemTime;
pub enum ResponseWrapper<R> {
MetaInterfaceResponse(R),
PasteContentResponse(R, SystemTime),
PrettyPasteContentResponse(R, SystemTime),
RawPasteContentResponse(R, SystemTime),
Redirect(Box<Redirect>),
NotFound(String),
ServerError(String),
@@ -19,8 +20,12 @@ impl<'r, 'o: 'r, R: Responder<'r, 'o>> ResponseWrapper<R> {
Self::MetaInterfaceResponse(responder)
}
pub fn paste_response(responder: R, modified: SystemTime) -> Self {
Self::PasteContentResponse(responder, modified)
pub fn pretty_paste_response(responder: R, modified: SystemTime) -> Self {
Self::PrettyPasteContentResponse(responder, modified)
}
pub fn raw_paste_response(responder: R, modified: SystemTime) -> Self {
Self::RawPasteContentResponse(responder, modified)
}
pub fn redirect(redirect: Redirect) -> Self {
@@ -51,15 +56,31 @@ impl<'r, 'o: 'r, R: Responder<'r, 'o>> Responder<'r, 'o>
MetaInterfaceResponse(sup) => response
.join(sup.respond_to(request)?)
.raw_header("ETag", &*crate::BINARY_ETAG)
.raw_header(
"Cache-Control",
"max-age=604800, stale-while-revalidate=86400",
)
.ok(),
PasteContentResponse(sup, modified) => response
PrettyPasteContentResponse(sup, modified) => response
.join(sup.respond_to(request)?)
.raw_header("Last-Modified", http_strftime(modified))
.raw_header(
"Cache-Control",
"max-age=604800, stale-while-revalidate=86400",
)
.ok(),
RawPasteContentResponse(sup, modified) => response
.join(sup.respond_to(request)?)
.raw_header("Last-Modified", http_strftime(modified))
.raw_header("Cache-Control", "max-age=604800, immutable")
.ok(),
Redirect(sup) => response.join(sup.respond_to(request)?).ok(),
NotFound(s) => {
let body = format!("Unable to find entity '{}'", s);
response
.sized_body(body.len(), Cursor::new(body))
.status(Status::NotFound)

View File

@@ -2,9 +2,11 @@ use rocket_dyn_templates::Template;
use std::collections::HashMap;
use crate::models::response_wrapper::ResponseWrapper;
#[get("/")]
pub async fn index() -> Option<Template> {
pub async fn index() -> ResponseWrapper<Template> {
let mut map = HashMap::new();
map.insert("title", "bin");
Some(Template::render("index.html", &map))
ResponseWrapper::meta_response(Template::render("index.html", &map))
}

View File

@@ -66,7 +66,9 @@ pub async fn pretter_retrieve_inner(
let rendered = Template::render("pretty.html", &map);
match tree_magic::match_filepath("text/plain", &filepath) {
true => ResponseWrapper::paste_response(rendered, modified_date),
true => {
ResponseWrapper::pretty_paste_response(rendered, modified_date)
}
false => ResponseWrapper::server_error("media type unacceptable"),
}
}

View File

@@ -42,5 +42,5 @@ pub async fn retrieve_inner(id: &str) -> ResponseWrapper<File> {
}
};
ResponseWrapper::paste_response(file, modified_date)
ResponseWrapper::raw_paste_response(file, modified_date)
}