From 8b4727c3a4d6c6eb617ab6feb172796bd433a5a4 Mon Sep 17 00:00:00 2001 From: sigoden Date: Thu, 10 Nov 2022 19:28:01 +0800 Subject: [PATCH] fix: panic on PROPFIND // (#144) --- src/server.rs | 6 +++++- tests/webdav.rs | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/server.rs b/src/server.rs index 595721f..a32b219 100644 --- a/src/server.rs +++ b/src/server.rs @@ -897,7 +897,11 @@ impl Server { } fn extract_path(&self, path: &str) -> Option { - 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 { diff --git a/tests/webdav.rs b/tests/webdav.rs index 04b4ae0..36261fe 100644 --- a/tests/webdav.rs +++ b/tests/webdav.rs @@ -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()?;