fix: status code for MKCOL on existing resource (#142)

* Fix status code for MKCOL on existing resource

Per https://datatracker.ietf.org/doc/html/rfc4918#section-9.3.1,
MKCOL should return a 405 if the resource already exists.

Impetus for this change:
I am using dufs as a webdav server for [Joplin](https://joplinapp.org/)
which interpreted the previous behavior of returning a 403 as an error,
preventing syncing from working.

* add test

Co-authored-by: sigoden <sigoden@gmail.com>
This commit is contained in:
Aneesh Agrawal 2022-11-10 05:41:10 -05:00 committed by GitHub
parent 1a9990f04e
commit 604ccc6556
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 1 deletions

View file

@ -270,8 +270,11 @@ impl Server {
} }
} }
"MKCOL" => { "MKCOL" => {
if !allow_upload || !is_miss { if !allow_upload {
status_forbid(&mut res); status_forbid(&mut res);
} else if !is_miss {
*res.status_mut() = StatusCode::METHOD_NOT_ALLOWED;
*res.body_mut() = Body::from("Already exists");
} else { } else {
self.handle_mkcol(path, &mut res).await?; self.handle_mkcol(path, &mut res).await?;
} }

View file

@ -93,6 +93,13 @@ fn mkcol_not_allow_upload(server: TestServer) -> Result<(), Error> {
Ok(()) Ok(())
} }
#[rstest]
fn mkcol_already_exists(#[with(&["-A"])] server: TestServer) -> Result<(), Error> {
let resp = fetch!(b"MKCOL", format!("{}dira", server.url())).send()?;
assert_eq!(resp.status(), 405);
Ok(())
}
#[rstest] #[rstest]
fn copy_file(#[with(&["-A"])] server: TestServer) -> Result<(), Error> { fn copy_file(#[with(&["-A"])] server: TestServer) -> Result<(), Error> {
let new_url = format!("{}test2.html", server.url()); let new_url = format!("{}test2.html", server.url());