diff --git a/Cargo.lock b/Cargo.lock index 451fec0..7fd809b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -320,6 +320,17 @@ dependencies = [ "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]] name = "askama_derive" version = "0.11.2" @@ -1582,6 +1593,7 @@ dependencies = [ "actix-web", "actix-web-actors", "askama", + "askama_actix", "bytes", "bytesize", "crc32fast", diff --git a/Cargo.toml b/Cargo.toml index 6d1940b..5c71047 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ actix-http = "3.0.4" actix-web = "4.0.1" actix-web-actors = "4.1.0" askama = "0.11.1" +askama_actix = "0.13" bytes = "1.1.0" bytesize = "1.1.0" crc32fast = "1.3.2" diff --git a/flake.lock b/flake.lock index d248f57..0fb77ae 100644 --- a/flake.lock +++ b/flake.lock @@ -33,11 +33,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1653060744, - "narHash": "sha256-kfRusllRumpt33J1hPV+CeCCylCXEU7e0gn2/cIM7cY=", + "lastModified": 1655306633, + "narHash": "sha256-nv4FfWWV/dEelByjXJtJkoDPOHIsKfLq50RN3Hqq5Yk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "dfd82985c273aac6eced03625f454b334daae2e8", + "rev": "b1957596ff1c7aa8c55c4512b7ad1c9672502e8e", "type": "github" }, "original": { @@ -77,11 +77,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1653273659, - "narHash": "sha256-dHXYaNL1axhZZyiZXxt1WKhvZrYXq7bjCs3y5VjgyGI=", + "lastModified": 1655347556, + "narHash": "sha256-JZ06EaeHi9sbbO3n8qYZ8KzDfSbDlPVRHI6Pw4sAxRE=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "0fa3e01da1ce98e3b40063b8e2678095943402b1", + "rev": "1cc3dc5aec863c2f724a46f7086fb011004a4e6e", "type": "github" }, "original": { @@ -92,11 +92,11 @@ }, "utils": { "locked": { - "lastModified": 1652776076, - "narHash": "sha256-gzTw/v1vj4dOVbpBSJX4J0DwUR6LIyXo7/SuuTJp1kM=", + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "04c1b180862888302ddfb2e3ad9eaa63afc60cf8", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", "type": "github" }, "original": { diff --git a/src/main.rs b/src/main.rs index 97b4876..cf591ab 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,12 +6,13 @@ mod zip; use std::{fmt::Debug, path::PathBuf, str::FromStr}; +use actix_http::StatusCode; use actix_web::{ error::InternalError, get, middleware::Logger, post, web, App, HttpRequest, HttpResponse, HttpServer, Responder, }; use actix_web_actors::ws; -use askama::Template; +use askama_actix::{Template, TemplateToResponse}; use bytesize::ByteSize; use log::{error, warn}; use serde::{Deserialize, Serialize}; @@ -55,19 +56,15 @@ pub fn log_auth_failure(ip_addr: &str) { #[derive(Template)] #[template(path = "index.html")] -struct IndexPage<'a> { - cachebuster: &'a str, +struct IndexPage { + cachebuster: String, } #[get("/")] async fn index(data: web::Data) -> impl Responder { - HttpResponse::Ok().body( - IndexPage { - cachebuster: &data.config.cachebuster, - } - .render() - .unwrap(), - ) + IndexPage { + cachebuster: data.config.cachebuster.clone(), + } } #[derive(Deserialize)] @@ -129,19 +126,16 @@ async fn handle_download( .into_response(&req)) } else { let offsets = info.contents.as_deref().map(zip::file_data_offsets); - Ok(HttpResponse::Ok().body( - DownloadPage { - info: DownloadInfo { - file: info, - code: code.clone(), - available: file.metadata().await?.len(), - offsets, - }, - cachebuster: &data.config.cachebuster, - } - .render() - .unwrap(), - )) + Ok(DownloadPage { + info: DownloadInfo { + file: info, + code: code.clone(), + available: file.metadata().await?.len(), + offsets, + }, + cachebuster: &data.config.cachebuster, + } + .to_response()) } } @@ -188,17 +182,13 @@ fn not_found(req: HttpRequest, data: web::Data, report: bool) -> ac let ip_addr = get_ip_addr(&req, data.config.reverse_proxy); log_auth_failure(&ip_addr); } - Err(InternalError::from_response( - "Download not found", - HttpResponse::NotFound().body( - NotFoundPage { - cachebuster: &data.config.cachebuster, - } - .render() - .unwrap(), - ), - ) - .into()) + let mut resp = NotFoundPage { + cachebuster: &data.config.cachebuster, + } + .to_response(); + *resp.status_mut() = StatusCode::NOT_FOUND; + + Err(InternalError::from_response("Download not found", resp).into()) } #[get("/upload")]