From b1b85e6ec721869e80346fa1f7e25b17ae3b9c93 Mon Sep 17 00:00:00 2001 From: Emi Simpson Date: Mon, 25 Oct 2021 14:53:22 -0400 Subject: [PATCH] Add a handler for rendering images --- web/src/main.rs | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/web/src/main.rs b/web/src/main.rs index e548578..9715a8f 100644 --- a/web/src/main.rs +++ b/web/src/main.rs @@ -8,11 +8,17 @@ use actix_web::dev::HttpResponseBuilder; use actix_web::http::{header, StatusCode}; use actix_web::middleware::normalize::TrailingSlash; use actix_web::middleware::{self, Logger}; +use actix_web::web::resource; use actix_web::{App, HttpRequest, HttpResponse, HttpServer, Responder, ResponseError, Result, post, web}; use askama::Template; use pronouns_today::user_preferences::Preference; use pronouns_today::{InstanceSettings, Pronoun}; +#[cfg(feature = "ogp_images")] +use image::{DynamicImage, ImageOutputFormat}; +#[cfg(feature = "ogp_images")] +use ogp_images::render_today; + #[derive(Template)] #[template(path = "index.html")] struct IndexTemplate<'a> { @@ -88,6 +94,24 @@ async fn handle_basic_request( .body(render_page(pronoun?, &settings, name.map(str::to_owned)))) } +#[cfg(feature = "ogp_images")] +async fn handle_thumbnail_request( + settings: web::Data, + req: HttpRequest, +) -> Result { + + let (_, name, pronoun) = get_request_info(&settings, &req); + + let mut data: Vec = Vec::with_capacity(15_000); + let image = DynamicImage::ImageRgb8(render_today(pronoun?, name.unwrap_or(""))); + image.write_to(&mut data, ImageOutputFormat::Png) + .expect("Error encoding thumbnail to PNG"); + + Ok(HttpResponse::Ok() + .content_type("image/png") + .body(data)) +} + async fn not_found() -> impl Responder { HttpResponse::NotFound() .content_type("text/html; charset=utf-8") @@ -99,10 +123,18 @@ async fn main() -> std::io::Result<()> { env_logger::init(); HttpServer::new(|| { let logger = Logger::default(); - App::new() + let app = App::new() .data(InstanceSettings::default()) .wrap(logger) - .wrap(middleware::NormalizePath::new(TrailingSlash::Trim)) + .wrap(middleware::NormalizePath::new(TrailingSlash::Trim)); + + #[cfg(feature = "ogp_images")] + let app = app + .service(resource("/thumb.png") .to(handle_thumbnail_request)) + .service(resource("/{prefs}/thumb.png") .to(handle_thumbnail_request)) + .service(resource("/{name}/{prefs}/thumb.png").to(handle_thumbnail_request)); + + app .service(resource("/") .to(handle_basic_request)) .service(resource("/{prefs}") .to(handle_basic_request)) .service(resource("/{name}/{prefs}").to(handle_basic_request))