use askama_actix responders so we get the correct content types/other headers for free

This commit is contained in:
xenofem 2022-06-16 19:48:10 -04:00
parent 5fdbe8dfee
commit 78cd45d68a
3 changed files with 37 additions and 34 deletions

12
Cargo.lock generated
View file

@ -320,6 +320,17 @@ dependencies = [
"askama_shared", "askama_shared",
] ]
[[package]]
name = "askama_actix"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c52f74f8382a142ecfc052100b21abc33f2c069e20fe345808e7ed914b179449"
dependencies = [
"actix-web",
"askama",
"askama_shared",
]
[[package]] [[package]]
name = "askama_derive" name = "askama_derive"
version = "0.11.2" version = "0.11.2"
@ -1582,6 +1593,7 @@ dependencies = [
"actix-web", "actix-web",
"actix-web-actors", "actix-web-actors",
"askama", "askama",
"askama_actix",
"bytes", "bytes",
"bytesize", "bytesize",
"crc32fast", "crc32fast",

View file

@ -14,6 +14,7 @@ actix-http = "3.0.4"
actix-web = "4.0.1" actix-web = "4.0.1"
actix-web-actors = "4.1.0" actix-web-actors = "4.1.0"
askama = "0.11.1" askama = "0.11.1"
askama_actix = "0.13"
bytes = "1.1.0" bytes = "1.1.0"
bytesize = "1.1.0" bytesize = "1.1.0"
crc32fast = "1.3.2" crc32fast = "1.3.2"

View file

@ -6,12 +6,13 @@ mod zip;
use std::{fmt::Debug, path::PathBuf, str::FromStr}; use std::{fmt::Debug, path::PathBuf, str::FromStr};
use actix_http::StatusCode;
use actix_web::{ use actix_web::{
error::InternalError, get, middleware::Logger, post, web, App, HttpRequest, HttpResponse, error::InternalError, get, middleware::Logger, post, web, App, HttpRequest, HttpResponse,
HttpServer, Responder, HttpServer, Responder,
}; };
use actix_web_actors::ws; use actix_web_actors::ws;
use askama::Template; use askama_actix::{Template, TemplateToResponse};
use bytesize::ByteSize; use bytesize::ByteSize;
use log::{error, warn}; use log::{error, warn};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -55,19 +56,15 @@ pub fn log_auth_failure(ip_addr: &str) {
#[derive(Template)] #[derive(Template)]
#[template(path = "index.html")] #[template(path = "index.html")]
struct IndexPage<'a> { struct IndexPage {
cachebuster: &'a str, cachebuster: String,
} }
#[get("/")] #[get("/")]
async fn index(data: web::Data<AppState>) -> impl Responder { async fn index(data: web::Data<AppState>) -> impl Responder {
HttpResponse::Ok().body( IndexPage {
IndexPage { cachebuster: data.config.cachebuster.clone(),
cachebuster: &data.config.cachebuster, }
}
.render()
.unwrap(),
)
} }
#[derive(Deserialize)] #[derive(Deserialize)]
@ -129,19 +126,16 @@ async fn handle_download(
.into_response(&req)) .into_response(&req))
} else { } else {
let offsets = info.contents.as_deref().map(zip::file_data_offsets); let offsets = info.contents.as_deref().map(zip::file_data_offsets);
Ok(HttpResponse::Ok().body( Ok(DownloadPage {
DownloadPage { info: DownloadInfo {
info: DownloadInfo { file: info,
file: info, code: code.clone(),
code: code.clone(), available: file.metadata().await?.len(),
available: file.metadata().await?.len(), offsets,
offsets, },
}, cachebuster: &data.config.cachebuster,
cachebuster: &data.config.cachebuster, }
} .to_response())
.render()
.unwrap(),
))
} }
} }
@ -188,17 +182,13 @@ fn not_found<T>(req: HttpRequest, data: web::Data<AppState>, report: bool) -> ac
let ip_addr = get_ip_addr(&req, data.config.reverse_proxy); let ip_addr = get_ip_addr(&req, data.config.reverse_proxy);
log_auth_failure(&ip_addr); log_auth_failure(&ip_addr);
} }
Err(InternalError::from_response( let mut resp = NotFoundPage {
"Download not found", cachebuster: &data.config.cachebuster,
HttpResponse::NotFound().body( }
NotFoundPage { .to_response();
cachebuster: &data.config.cachebuster, *resp.status_mut() = StatusCode::NOT_FOUND;
}
.render() Err(InternalError::from_response("Download not found", resp).into())
.unwrap(),
),
)
.into())
} }
#[get("/upload")] #[get("/upload")]