diff --git a/src/dav/encoder.rs b/src/dav/encoder.rs index 41e93f3..6bccc78 100644 --- a/src/dav/encoder.rs +++ b/src/dav/encoder.rs @@ -647,6 +647,9 @@ impl QuickWritable for Violation { async fn write(&self, xml: &mut Writer, ctx: C) -> Result<(), QError> { match self { Violation::LockTokenMatchesRequestUri => xml.write_event_async(Event::Empty(ctx.create_dav_element("lock-token-matches-request-uri"))).await?, + Violation::LockTokenSubmitted(hrefs) if hrefs.is_empty() => { + xml.write_event_async(Event::Empty(ctx.create_dav_element("lock-token-submitted"))).await? + }, Violation::LockTokenSubmitted(hrefs) => { let start = ctx.create_dav_element("lock-token-submitted"); let end = start.to_end(); @@ -657,6 +660,9 @@ impl QuickWritable for Violation { } xml.write_event_async(Event::End(end)).await?; }, + Violation::NoConflictingLock(hrefs) if hrefs.is_empty() => { + xml.write_event_async(Event::Empty(ctx.create_dav_element("no-conflicting-lock"))).await? + }, Violation::NoConflictingLock(hrefs) => { let start = ctx.create_dav_element("no-conflicting-lock"); let end = start.to_end(); @@ -1059,4 +1065,33 @@ mod tests { assert_eq!(&got, expected, "\n---GOT---\n{got}\n---EXP---\n{expected}\n"); } + + #[tokio::test] + async fn rfc_delete_locked2() { + let got = serialize( + NoExtension { root: true }, + &Multistatus { + responses: vec![Response { + href: Href("http://www.example.com/container/resource3".into()), + status_or_propstat: StatusOrPropstat::Status(Status(http::status::StatusCode::from_u16(423).unwrap())), + error: Some(Error(vec![Violation::LockTokenSubmitted(vec![])])), + responsedescription: None, + location: None, + }], + responsedescription: None, + }, + ).await; + + let expected = r#" + + http://www.example.com/container/resource3 + HTTP/1.1 423 Locked + + + + +"#; + + assert_eq!(&got, expected, "\n---GOT---\n{got}\n---EXP---\n{expected}\n"); + } }