From a457efb97e8b169b44606fb08325d8142217424b Mon Sep 17 00:00:00 2001 From: AINDUSTRIES Date: Mon, 6 Oct 2025 16:46:06 +0200 Subject: [PATCH] Added middleware for mimetype --- src/main.rs | 16 ++++++++--- src/middleware/mod.rs | 63 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 src/middleware/mod.rs diff --git a/src/main.rs b/src/main.rs index 2aea481..f65aba0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,15 +1,25 @@ mod html; mod pages; +mod middleware; -use actix_web::{App, HttpServer}; +use actix_web::{web, App, HttpServer}; -use pages::{files::file, index}; +use pages::{files::file, index, projects::{projects, project}}; +use middleware::MimeType; #[actix_web::main] async fn main() { let bind_address = "0.0.0.0:8080"; if let Ok(server) = - HttpServer::new(|| App::new().service(index).service(file)).bind(bind_address) + HttpServer::new(|| App::new() + .service(file) + .service(web::scope("") + .wrap(MimeType::new("text/html".to_string())) + .service(index) + .service(projects) + .service(project) + ) + ).bind(bind_address) { match server.run().await { Ok(_) => {} diff --git a/src/middleware/mod.rs b/src/middleware/mod.rs new file mode 100644 index 0000000..bf0aac1 --- /dev/null +++ b/src/middleware/mod.rs @@ -0,0 +1,63 @@ +use std::future::{ready, Ready}; +use actix_web::dev::{forward_ready, Service, ServiceRequest, ServiceResponse, Transform}; +use actix_web::Error; +use actix_web::http::header::{HeaderValue, CONTENT_TYPE}; +use futures_util::future::LocalBoxFuture; + +pub(crate) struct MimeType { + mime_type: String, +} + +impl MimeType { + pub(crate) fn new(mime_type: String) -> Self { + Self { + mime_type + } + } +} + +impl Transform for MimeType +where + S: Service, Error=Error>, + S::Future: 'static, + B: 'static, +{ + type Response = ServiceResponse; + type Error = Error; + type Transform = MimeTypeMiddleware; + type InitError = (); + type Future = Ready>; + + fn new_transform(&self, service: S) -> Self::Future { + let mime_type = self.mime_type.clone(); + ready(Ok(MimeTypeMiddleware{service, mime_type})) + } +} + +pub(crate) struct MimeTypeMiddleware { + service: S, + mime_type: String, +} + +impl Service for MimeTypeMiddleware +where + S: Service, Error = Error>, + S::Future: 'static, + B: 'static, +{ + type Response = ServiceResponse; + type Error = Error; + type Future = LocalBoxFuture<'static, Result>; + + forward_ready!(service); + + fn call(&self, req: ServiceRequest) -> Self::Future { + let fut = self.service.call(req); + let val = HeaderValue::from_str(self.mime_type.as_str()).unwrap_or_else(|_| HeaderValue::from_static("text/html")); + Box::pin(async move { + let mut res = fut.await?; + res.headers_mut().append(CONTENT_TYPE, val); + Ok(res) + }) + } +} \ No newline at end of file