diff --git a/src/dav.rs b/src/dav.rs index cb6a8b1..d89f1d4 100644 --- a/src/dav.rs +++ b/src/dav.rs @@ -212,10 +212,11 @@ pub fn multistatus(body: &[u8]) -> Result, ErrorCode> { /// Some servers, WsgiDAV among them, list `getetag` bare while their `ETag` /// header quotes the same tag, so a revision read from a listing and one /// returned by a write would differ for the same bytes. Quoting a bare tag -/// gives every revision one spelling, and `If-Match` accepts that form. +/// gives every revision one spelling, and `If-Match` accepts that form. A tag +/// that is already quoted, weak or strong, is kept as it is. pub fn etag(value: &str) -> String { let value = value.trim(); - if value.starts_with('"') || value.starts_with("W/") { + if value.starts_with('"') || value.starts_with("W/\"") { value.to_owned() } else { format!("\"{value}\"") @@ -435,5 +436,6 @@ mod tests { assert_eq!(etag("1996000-1790356720-264"), "\"1996000-1790356720-264\""); assert_eq!(etag(" \"v1\" "), "\"v1\""); assert_eq!(etag("W/\"v1\""), "W/\"v1\""); + assert_eq!(etag("W/v1"), "\"W/v1\""); } }