From c7d42a3f1cdeec115007a7264dcb970113a550a9 Mon Sep 17 00:00:00 2001 From: sigoden Date: Wed, 15 Jun 2022 20:24:53 +0800 Subject: [PATCH] fix: webdav propfind dir with slash (#42) --- src/server.rs | 9 ++++++++- tests/webdav.rs | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/server.rs b/src/server.rs index 0c2c9d4..2aee843 100644 --- a/src/server.rs +++ b/src/server.rs @@ -812,9 +812,16 @@ struct PathItem { } impl PathItem { + pub fn is_dir(&self) -> bool { + self.path_type == PathType::Dir || self.path_type == PathType::SymlinkDir + } + pub fn to_dav_xml(&self, prefix: &str) -> String { let mtime = Utc.timestamp_millis(self.mtime as i64).to_rfc2822(); - let href = encode_uri(&format!("{}{}", prefix, &self.name)); + let mut href = encode_uri(&format!("{}{}", prefix, &self.name)); + if self.is_dir() && !href.ends_with('/') { + href.push('/'); + } let displayname = escape_str_pcdata(self.base_name()); match self.path_type { PathType::Dir | PathType::SymlinkDir => format!( diff --git a/tests/webdav.rs b/tests/webdav.rs index fee0ce8..cedfad5 100644 --- a/tests/webdav.rs +++ b/tests/webdav.rs @@ -10,7 +10,7 @@ fn propfind_dir(server: TestServer) -> Result<(), Error> { let resp = fetch!(b"PROPFIND", format!("{}dira", server.url())).send()?; assert_eq!(resp.status(), 207); let body = resp.text()?; - assert!(body.contains("/dira")); + assert!(body.contains("/dira/")); assert!(body.contains("dira")); for f in FILES { assert!(body.contains(&format!("/dira/{}", utils::encode_uri(f)))); @@ -29,7 +29,7 @@ fn propfind_dir_depth0(server: TestServer) -> Result<(), Error> { .send()?; assert_eq!(resp.status(), 207); let body = resp.text()?; - assert!(body.contains("/dira")); + assert!(body.contains("/dira/")); assert!(body.contains("dira")); assert_eq!( body.lines()