Add a handler for rendering images
This commit is contained in:
parent
01ec3137a2
commit
b1b85e6ec7
|
@ -8,11 +8,17 @@ use actix_web::dev::HttpResponseBuilder;
|
||||||
use actix_web::http::{header, StatusCode};
|
use actix_web::http::{header, StatusCode};
|
||||||
use actix_web::middleware::normalize::TrailingSlash;
|
use actix_web::middleware::normalize::TrailingSlash;
|
||||||
use actix_web::middleware::{self, Logger};
|
use actix_web::middleware::{self, Logger};
|
||||||
|
use actix_web::web::resource;
|
||||||
use actix_web::{App, HttpRequest, HttpResponse, HttpServer, Responder, ResponseError, Result, post, web};
|
use actix_web::{App, HttpRequest, HttpResponse, HttpServer, Responder, ResponseError, Result, post, web};
|
||||||
use askama::Template;
|
use askama::Template;
|
||||||
use pronouns_today::user_preferences::Preference;
|
use pronouns_today::user_preferences::Preference;
|
||||||
use pronouns_today::{InstanceSettings, Pronoun};
|
use pronouns_today::{InstanceSettings, Pronoun};
|
||||||
|
|
||||||
|
#[cfg(feature = "ogp_images")]
|
||||||
|
use image::{DynamicImage, ImageOutputFormat};
|
||||||
|
#[cfg(feature = "ogp_images")]
|
||||||
|
use ogp_images::render_today;
|
||||||
|
|
||||||
#[derive(Template)]
|
#[derive(Template)]
|
||||||
#[template(path = "index.html")]
|
#[template(path = "index.html")]
|
||||||
struct IndexTemplate<'a> {
|
struct IndexTemplate<'a> {
|
||||||
|
@ -88,6 +94,24 @@ async fn handle_basic_request(
|
||||||
.body(render_page(pronoun?, &settings, name.map(str::to_owned))))
|
.body(render_page(pronoun?, &settings, name.map(str::to_owned))))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "ogp_images")]
|
||||||
|
async fn handle_thumbnail_request(
|
||||||
|
settings: web::Data<InstanceSettings>,
|
||||||
|
req: HttpRequest,
|
||||||
|
) -> Result<impl Responder> {
|
||||||
|
|
||||||
|
let (_, name, pronoun) = get_request_info(&settings, &req);
|
||||||
|
|
||||||
|
let mut data: Vec<u8> = 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 {
|
async fn not_found() -> impl Responder {
|
||||||
HttpResponse::NotFound()
|
HttpResponse::NotFound()
|
||||||
.content_type("text/html; charset=utf-8")
|
.content_type("text/html; charset=utf-8")
|
||||||
|
@ -99,10 +123,18 @@ async fn main() -> std::io::Result<()> {
|
||||||
env_logger::init();
|
env_logger::init();
|
||||||
HttpServer::new(|| {
|
HttpServer::new(|| {
|
||||||
let logger = Logger::default();
|
let logger = Logger::default();
|
||||||
App::new()
|
let app = App::new()
|
||||||
.data(InstanceSettings::default())
|
.data(InstanceSettings::default())
|
||||||
.wrap(logger)
|
.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("/") .to(handle_basic_request))
|
||||||
.service(resource("/{prefs}") .to(handle_basic_request))
|
.service(resource("/{prefs}") .to(handle_basic_request))
|
||||||
.service(resource("/{name}/{prefs}").to(handle_basic_request))
|
.service(resource("/{name}/{prefs}").to(handle_basic_request))
|
||||||
|
|
Loading…
Reference in New Issue