From b98058a7ffe24048550cc8f04c867c6ea23e5322 Mon Sep 17 00:00:00 2001 From: Lennart <18233294+lennart-k@users.noreply.github.com> Date: Wed, 6 Nov 2024 16:43:52 +0100 Subject: [PATCH] refactor OPTIONS handling --- .../methods/report/calendar_multiget.rs | 1 - crates/caldav/src/lib.rs | 40 +++++++++---------- crates/carddav/src/lib.rs | 38 +++++++++--------- 3 files changed, 37 insertions(+), 42 deletions(-) diff --git a/crates/caldav/src/calendar/methods/report/calendar_multiget.rs b/crates/caldav/src/calendar/methods/report/calendar_multiget.rs index 5747667..2a2b2d8 100644 --- a/crates/caldav/src/calendar/methods/report/calendar_multiget.rs +++ b/crates/caldav/src/calendar/methods/report/calendar_multiget.rs @@ -50,7 +50,6 @@ pub async fn get_objects_calendar_multiget( match store.get_object(principal, cal_id, object_id).await { Ok(object) => result.push(object), Err(rustical_store::Error::NotFound) => not_found.push(href.to_owned()), - // TODO: Maybe add error handling on a per-object basis Err(err) => return Err(err.into()), }; } diff --git a/crates/caldav/src/lib.rs b/crates/caldav/src/lib.rs index 99989a7..c09b801 100644 --- a/crates/caldav/src/lib.rs +++ b/crates/caldav/src/lib.rs @@ -1,10 +1,11 @@ -use actix_web::dev::Service; +use actix_web::dev::ServiceResponse; use actix_web::http::header::{HeaderName, HeaderValue}; use actix_web::http::{Method, StatusCode}; +use actix_web::middleware::{ErrorHandlerResponse, ErrorHandlers}; use actix_web::web::{self, Data}; +use actix_web::HttpResponse; use calendar::resource::CalendarResourceService; use calendar_object::resource::CalendarObjectResourceService; -use futures_util::FutureExt; use principal::{PrincipalResource, PrincipalResourceService}; use rustical_dav::resource::ResourceService; use rustical_dav::resources::RootResourceService; @@ -31,28 +32,25 @@ pub fn configure_dav( cfg.service( web::scope("") .wrap(AuthenticationMiddleware::new(auth_provider)) - .wrap_fn(|req, srv| { - // Middleware to set the DAV header - // Could be more elegant if actix_web::guard::RegisteredMethods was public :( - let method = req.method().clone(); - srv.call(req).map(move |res| { - if method == Method::OPTIONS { - return res.map(|mut response| { - if response.status() == StatusCode::METHOD_NOT_ALLOWED { - response.headers_mut().insert( + .wrap( + ErrorHandlers::new().handler(StatusCode::METHOD_NOT_ALLOWED, |res| { + Ok(ErrorHandlerResponse::Response( + if res.request().method() == Method::OPTIONS { + let response = HttpResponse::Ok() + .insert_header(( HeaderName::from_static("dav"), HeaderValue::from_static( - "1, 2, 3, calendar-access, extended-mkcol", + "1, 2, 3, access-control, calendar-access, extended-mkcol", ), - ); - *response.response_mut().status_mut() = StatusCode::OK; - } - response - }); - } - res - }) - }) + )) + .finish(); + ServiceResponse::new(res.into_parts().0, response).map_into_right_body() + } else { + res.map_into_left_body() + }, + )) + }), + ) .app_data(Data::from(store.clone())) .service(RootResourceService::::actix_resource()) .service( diff --git a/crates/carddav/src/lib.rs b/crates/carddav/src/lib.rs index b243ed9..14d6547 100644 --- a/crates/carddav/src/lib.rs +++ b/crates/carddav/src/lib.rs @@ -1,15 +1,16 @@ use actix_web::{ - dev::Service, + dev::ServiceResponse, http::{ header::{HeaderName, HeaderValue}, Method, StatusCode, }, + middleware::{ErrorHandlerResponse, ErrorHandlers}, web::{self, Data}, + HttpResponse, }; use address_object::resource::AddressObjectResourceService; use addressbook::resource::AddressbookResourceService; pub use error::Error; -use futures_util::FutureExt; use principal::{PrincipalResource, PrincipalResourceService}; use rustical_dav::resource::ResourceService; use rustical_dav::resources::RootResourceService; @@ -36,28 +37,25 @@ pub fn configure_dav( cfg.service( web::scope("") .wrap(AuthenticationMiddleware::new(auth_provider)) - .wrap_fn(|req, srv| { - // Middleware to set the DAV header - // Could be more elegant if actix_web::guard::RegisteredMethods was public :( - let method = req.method().clone(); - srv.call(req).map(move |res| { - if method == Method::OPTIONS { - return res.map(|mut response| { - if response.status() == StatusCode::METHOD_NOT_ALLOWED { - response.headers_mut().insert( + .wrap( + ErrorHandlers::new().handler(StatusCode::METHOD_NOT_ALLOWED, |res| { + Ok(ErrorHandlerResponse::Response( + if res.request().method() == Method::OPTIONS { + let response = HttpResponse::Ok() + .insert_header(( HeaderName::from_static("dav"), HeaderValue::from_static( "1, 2, 3, access-control, addressbook, extended-mkcol", ), - ); - *response.response_mut().status_mut() = StatusCode::OK; - } - response - }); - } - res - }) - }) + )) + .finish(); + ServiceResponse::new(res.into_parts().0, response).map_into_right_body() + } else { + res.map_into_left_body() + }, + )) + }), + ) .app_data(Data::from(store.clone())) .service(RootResourceService::::actix_resource()) .service(