rustical_dav: Move propfind parsing to resource type

This commit is contained in:
Lennart
2025-07-29 14:53:16 +02:00
parent e1a7a188f5
commit 78f7a7e155
2 changed files with 19 additions and 20 deletions

View File

@@ -58,24 +58,8 @@ pub(crate) async fn route_propfind<R: ResourceService>(
} }
// A request body is optional. If empty we MUST return all props // A request body is optional. If empty we MUST return all props
let propfind_self: PropfindElement<<<R::Resource as Resource>::Prop as PropName>::Names> = let propfind_self = R::Resource::parse_propfind(body).map_err(Error::XmlError)?;
if !body.is_empty() { let propfind_member = R::MemberType::parse_propfind(body).map_err(Error::XmlError)?;
PropfindElement::parse_str(body).map_err(Error::XmlError)?
} else {
PropfindElement {
prop: PropfindType::Allprop,
include: None,
}
};
let propfind_member: PropfindElement<<<R::MemberType as Resource>::Prop as PropName>::Names> =
if !body.is_empty() {
PropfindElement::parse_str(body).map_err(Error::XmlError)?
} else {
PropfindElement {
prop: PropfindType::Allprop,
include: None,
}
};
let mut member_responses = Vec::new(); let mut member_responses = Vec::new();
if depth != &Depth::Zero { if depth != &Depth::Zero {

View File

@@ -1,14 +1,16 @@
use crate::Principal; use crate::Principal;
use crate::privileges::UserPrivilegeSet; use crate::privileges::UserPrivilegeSet;
use crate::xml::multistatus::{PropTagWrapper, PropstatElement, PropstatWrapper}; use crate::xml::multistatus::{PropTagWrapper, PropstatElement, PropstatWrapper};
use crate::xml::{PropElement, PropfindType, Resourcetype}; use crate::xml::{PropElement, PropfindElement, PropfindType, Resourcetype};
use crate::xml::{TagList, multistatus::ResponseElement}; use crate::xml::{TagList, multistatus::ResponseElement};
use headers::{ETag, IfMatch, IfNoneMatch}; use headers::{ETag, IfMatch, IfNoneMatch};
use http::StatusCode; use http::StatusCode;
use itertools::Itertools; use itertools::Itertools;
use quick_xml::name::Namespace; use quick_xml::name::Namespace;
pub use resource_service::ResourceService; pub use resource_service::ResourceService;
use rustical_xml::{EnumVariants, NamespaceOwned, PropName, XmlDeserialize, XmlSerialize}; use rustical_xml::{
EnumVariants, NamespaceOwned, PropName, XmlDeserialize, XmlDocument, XmlSerialize,
};
use std::collections::HashSet; use std::collections::HashSet;
use std::str::FromStr; use std::str::FromStr;
@@ -102,6 +104,19 @@ pub trait Resource: Clone + Send + 'static {
principal: &Self::Principal, principal: &Self::Principal,
) -> Result<UserPrivilegeSet, Self::Error>; ) -> Result<UserPrivilegeSet, Self::Error>;
fn parse_propfind(
body: &str,
) -> Result<PropfindElement<<Self::Prop as PropName>::Names>, rustical_xml::XmlError> {
if !body.is_empty() {
PropfindElement::parse_str(body)
} else {
Ok(PropfindElement {
prop: PropfindType::Allprop,
include: None,
})
}
}
fn propfind( fn propfind(
&self, &self,
path: &str, path: &str,