Add status code to multistatus element

This commit is contained in:
Lennart
2024-08-02 20:35:52 +02:00
parent 35ec1f3899
commit 2bc9635501
4 changed files with 24 additions and 1 deletions

View File

@@ -44,7 +44,13 @@ pub async fn route_propfind<A: CheckAuthentication, R: ResourceService + ?Sized>
prefix: Data<ServicePrefix>,
auth: AuthInfoExtractor<A>,
depth: Depth,
) -> Result<MultistatusElement<PropstatWrapper<<R::File as Resource>::Prop>, String>, R::Error> {
) -> Result<
MultistatusElement<
PropstatWrapper<<R::File as Resource>::Prop>,
PropstatWrapper<<R::MemberType as Resource>::Prop>,
>,
R::Error,
> {
debug!("{body}");
let auth_info = auth.inner;
let prefix = prefix.0.to_owned();
@@ -86,6 +92,7 @@ pub async fn route_propfind<A: CheckAuthentication, R: ResourceService + ?Sized>
Ok(MultistatusElement {
responses: vec![response],
member_responses,
..Default::default()
})
}

View File

@@ -151,6 +151,7 @@ pub async fn route_proppatch<A: CheckAuthentication, R: ResourceService + ?Sized
status: format!("HTTP/1.1 {}", StatusCode::CONFLICT),
}),
],
..Default::default()
}],
..Default::default()
})

View File

@@ -106,6 +106,7 @@ impl<R: Resource> HandlePropfind for R {
prop: TagList::from(props),
status: format!("HTTP/1.1 {}", StatusCode::OK),
})],
..Default::default()
});
}
if props.contains(&"allprop") {
@@ -155,6 +156,7 @@ impl<R: Resource> HandlePropfind for R {
Ok(ResponseElement {
href: path,
propstat: propstats,
..Default::default()
})
}
}

View File

@@ -36,9 +36,21 @@ pub enum PropstatWrapper<T: Serialize> {
#[serde(rename_all = "kebab-case")]
pub struct ResponseElement<PropstatType: Serialize> {
pub href: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
pub propstat: Vec<PropstatType>,
}
impl<PT: Serialize> Default for ResponseElement<PT> {
fn default() -> Self {
Self {
href: String::new(),
status: None,
propstat: vec![],
}
}
}
// RFC 2518
// <!ELEMENT multistatus (response+, responsedescription?) >
// Extended by sync-token as specified in RFC 6578
@@ -55,6 +67,7 @@ pub struct MultistatusElement<T1: Serialize, T2: Serialize> {
pub ns_caldav: &'static str,
#[serde(rename = "@xmlns:IC")]
pub ns_ical: &'static str,
#[serde(skip_serializing_if = "Option::is_none")]
pub sync_token: Option<String>,
}