rustical_dav: Add Overwrite header

This commit is contained in:
Lennart
2025-04-20 17:47:11 +02:00
parent 8eb46523a3
commit cd0ebc574a
5 changed files with 66 additions and 2 deletions

View File

@@ -0,0 +1,5 @@
mod depth;
mod overwrite;
pub use depth::{Depth, InvalidDepthHeader};
pub use overwrite::{InvalidOverwriteHeader, Overwrite};

View File

@@ -0,0 +1,59 @@
use actix_web::{FromRequest, HttpRequest, ResponseError, http::StatusCode};
use futures_util::future::{Ready, err, ok};
use thiserror::Error;
#[derive(Error, Debug)]
#[error("Invalid Overwrite header")]
pub struct InvalidOverwriteHeader;
impl ResponseError for InvalidOverwriteHeader {
fn status_code(&self) -> actix_web::http::StatusCode {
StatusCode::BAD_REQUEST
}
}
#[derive(Debug, PartialEq, Default)]
pub enum Overwrite {
#[default]
T,
F,
}
impl Overwrite {
pub fn is_true(&self) -> bool {
matches!(self, Self::T)
}
}
impl TryFrom<&[u8]> for Overwrite {
type Error = InvalidOverwriteHeader;
fn try_from(value: &[u8]) -> Result<Self, Self::Error> {
match value {
b"T" => Ok(Overwrite::T),
b"F" => Ok(Overwrite::F),
_ => Err(InvalidOverwriteHeader),
}
}
}
impl FromRequest for Overwrite {
type Error = InvalidOverwriteHeader;
type Future = Ready<Result<Self, Self::Error>>;
fn extract(req: &HttpRequest) -> Self::Future {
if let Some(overwrite_header) = req.headers().get("Overwrite") {
match overwrite_header.as_bytes().try_into() {
Ok(depth) => ok(depth),
Err(e) => err(e),
}
} else {
// default depth
ok(Overwrite::F)
}
}
fn from_request(req: &HttpRequest, _payload: &mut actix_web::dev::Payload) -> Self::Future {
Self::extract(req)
}
}

View File

@@ -1,6 +1,6 @@
pub mod depth_header;
pub mod error; pub mod error;
pub mod extensions; pub mod extensions;
pub mod header;
pub mod namespace; pub mod namespace;
pub mod privileges; pub mod privileges;
pub mod resource; pub mod resource;

View File

@@ -1,5 +1,5 @@
use crate::Error; use crate::Error;
use crate::depth_header::Depth; use crate::header::Depth;
use crate::privileges::UserPrivilege; use crate::privileges::UserPrivilege;
use crate::resource::Resource; use crate::resource::Resource;
use crate::resource::ResourceService; use crate::resource::ResourceService;