]> OzVa Git service - ozva-cloud/commitdiff
fix: webdav propfind dir with slash (#42)
authorsigoden <sigoden@gmail.com>
Wed, 15 Jun 2022 12:24:53 +0000 (20:24 +0800)
committerGitHub <noreply@github.com>
Wed, 15 Jun 2022 12:24:53 +0000 (20:24 +0800)
src/server.rs
tests/webdav.rs

index 0c2c9d4266b3089fa86deb161e75fbf2cf517c2a..2aee8435115257e6e8d325ac24cc6aceee4dc911 100644 (file)
@@ -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!(
index fee0ce8117b38c056278355ac988af34cf5d36bc..cedfad50acb62f1d5974e185ec7576806a88250d 100644 (file)
@@ -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("<D:href>/dira</D:href>"));
+    assert!(body.contains("<D:href>/dira/</D:href>"));
     assert!(body.contains("<D:displayname>dira</D:displayname>"));
     for f in FILES {
         assert!(body.contains(&format!("<D:href>/dira/{}</D:href>", 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("<D:href>/dira</D:href>"));
+    assert!(body.contains("<D:href>/dira/</D:href>"));
     assert!(body.contains("<D:displayname>dira</D:displayname>"));
     assert_eq!(
         body.lines()