]> OzVa Git service - ozva-cloud/commitdiff
fix: panic on PROPFIND // (#144)
authorsigoden <sigoden@gmail.com>
Thu, 10 Nov 2022 11:28:01 +0000 (19:28 +0800)
committerGitHub <noreply@github.com>
Thu, 10 Nov 2022 11:28:01 +0000 (19:28 +0800)
src/server.rs
tests/webdav.rs

index 595721f8cbdb146146bdfec17535399c731c3f10..a32b2195c1e737ac90c2785d2fd05ef4f5e8c139 100644 (file)
@@ -897,7 +897,11 @@ impl Server {
     }
 
     fn extract_path(&self, path: &str) -> Option<PathBuf> {
-        let decoded_path = decode_uri(&path[1..])?;
+        let mut slash_stripped_path = path;
+        while let Some(p) = slash_stripped_path.strip_prefix('/') {
+            slash_stripped_path = p
+        }
+        let decoded_path = decode_uri(slash_stripped_path)?;
         let slashes_switched = if cfg!(windows) {
             decoded_path.replace('/', "\\")
         } else {
index 04b4ae04746f57e96326f6afaaf4d815ebb0cdb6..36261fef2d0141e1c0d953894f652f9418f1bbe3 100644 (file)
@@ -47,6 +47,13 @@ fn propfind_404(server: TestServer) -> Result<(), Error> {
     Ok(())
 }
 
+#[rstest]
+fn propfind_double_slash(server: TestServer) -> Result<(), Error> {
+    let resp = fetch!(b"PROPFIND", format!("{}/", server.url())).send()?;
+    assert_eq!(resp.status(), 207);
+    Ok(())
+}
+
 #[rstest]
 fn propfind_file(server: TestServer) -> Result<(), Error> {
     let resp = fetch!(b"PROPFIND", format!("{}test.html", server.url())).send()?;