mirror of
https://github.com/lennart-k/rustical.git
synced 2025-12-13 21:42:34 +00:00
rustical_dav: Add Overwrite header
This commit is contained in:
5
crates/dav/src/header/mod.rs
Normal file
5
crates/dav/src/header/mod.rs
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
mod depth;
|
||||||
|
mod overwrite;
|
||||||
|
|
||||||
|
pub use depth::{Depth, InvalidDepthHeader};
|
||||||
|
pub use overwrite::{InvalidOverwriteHeader, Overwrite};
|
||||||
59
crates/dav/src/header/overwrite.rs
Normal file
59
crates/dav/src/header/overwrite.rs
Normal 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user