Move depth_extractor to dav crate

This commit is contained in:
Lennart
2023-09-14 14:04:48 +02:00
parent a4b2e104e7
commit 7edb041eb7
5 changed files with 4 additions and 2 deletions

View File

@@ -7,5 +7,7 @@ edition = "2021"
actix-web = "4.4.0"
anyhow = "1.0.75"
async-trait = "0.1.73"
derive_more = "0.99.17"
futures-util = "0.3.28"
quick-xml = "0.30.0"
rustical_auth = { path = "../auth/" }

View File

@@ -0,0 +1,53 @@
use actix_web::{http::StatusCode, FromRequest, HttpRequest, ResponseError};
use derive_more::Display;
use futures_util::future::{err, ok, Ready};
#[derive(Debug, Display)]
pub struct InvalidDepthHeader {}
impl ResponseError for InvalidDepthHeader {
fn status_code(&self) -> actix_web::http::StatusCode {
StatusCode::BAD_REQUEST
}
}
#[derive(Debug, PartialEq)]
pub enum Depth {
Zero,
One,
Infinity,
}
impl TryFrom<&[u8]> for Depth {
type Error = InvalidDepthHeader;
fn try_from(value: &[u8]) -> Result<Self, Self::Error> {
match value {
b"0" => Ok(Depth::Zero),
b"1" => Ok(Depth::One),
b"Infinity" | b"infinity" => Ok(Depth::Infinity),
_ => Err(InvalidDepthHeader {}),
}
}
}
impl FromRequest for Depth {
type Error = InvalidDepthHeader;
type Future = Ready<Result<Self, Self::Error>>;
fn extract(req: &HttpRequest) -> Self::Future {
if let Some(depth_header) = req.headers().get("Depth") {
match depth_header.as_bytes().try_into() {
Ok(depth) => ok(depth),
Err(e) => err(e),
}
} else {
// default depth
ok(Depth::Zero)
}
}
fn from_request(req: &HttpRequest, _payload: &mut actix_web::dev::Payload) -> Self::Future {
Self::extract(req)
}
}

View File

@@ -1,3 +1,4 @@
pub mod depth_extractor;
pub mod namespace;
pub mod resource;
pub mod xml_snippets;