diff --git a/internal/elements.go b/internal/elements.go index 786922e..7dc5639 100644 --- a/internal/elements.go +++ b/internal/elements.go @@ -374,11 +374,16 @@ type GetETag struct { type ETag string func (etag *ETag) UnmarshalText(b []byte) error { - s, err := strconv.Unquote(string(b)) - if err != nil { - return fmt.Errorf("webdav: failed to unquote ETag: %v", err) + s := string(b) + if (s[0:1] == "\"") { + sUnquoted, err := strconv.Unquote(s) + if err != nil { + return fmt.Errorf("webdav: failed to unquote ETag: %v", err) + } + *etag = ETag(sUnquoted) + } else { + *etag = ETag(s) } - *etag = ETag(s) return nil } diff --git a/internal/elements_test.go b/internal/elements_test.go index 73a6ef5..662e627 100644 --- a/internal/elements_test.go +++ b/internal/elements_test.go @@ -63,3 +63,19 @@ func TestTimeRoundTrip(t *testing.T) { t.Fatalf("invalid round-trip:\ngot= %s\nwant=%s", got, want) } } + +func TestETagUnmarshalText(t *testing.T) { + quotedEtag := `"123"` + + var got ETag + err := got.UnmarshalText([]byte(quotedEtag)) + if err != nil { + t.Fatalf("UnmarshalText failed for ETag: %+v", err) + } + + unquotedEtag := "123" + err = got.UnmarshalText([]byte(unquotedEtag)) + if err != nil { + t.Fatalf("UnmarshalText failed for ETag: %+v", err) + } +}