From c7998e6f7a8074e663a9f5ff9215b64d41977833 Mon Sep 17 00:00:00 2001 From: temeddix Date: Sat, 26 Sep 2026 02:37:35 +0900 Subject: [PATCH] A bare tag that starts with W/ is quoted like any other bare tag --- src/dav.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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\""); } }