mirror of
https://github.com/1f349/go-webdav.git
synced 2024-12-22 08:14:15 +00:00
internal: add ETag
This commit is contained in:
parent
ca51e9427a
commit
25678476db
@ -3,7 +3,6 @@ package caldav
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/emersion/go-webdav"
|
||||
@ -164,15 +163,11 @@ func decodeCalendarObjectList(ms *internal.Multistatus) ([]CalendarObject, error
|
||||
if err := resp.DecodeProp(&getETag); err != nil && !internal.IsNotFound(err) {
|
||||
return nil, err
|
||||
}
|
||||
etag, err := strconv.Unquote(getETag.ETag)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("carddav: failed to unquote ETag: %v", err)
|
||||
}
|
||||
|
||||
addrs = append(addrs, CalendarObject{
|
||||
Path: path,
|
||||
ModTime: time.Time(getLastMod.LastModified),
|
||||
ETag: etag,
|
||||
ETag: string(getETag.ETag),
|
||||
Data: calData.Data,
|
||||
})
|
||||
}
|
||||
|
@ -6,7 +6,6 @@ import (
|
||||
"net"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@ -222,10 +221,6 @@ func decodeAddressList(ms *internal.Multistatus) ([]AddressObject, error) {
|
||||
if err := resp.DecodeProp(&getETag); err != nil && !internal.IsNotFound(err) {
|
||||
return nil, err
|
||||
}
|
||||
etag, err := strconv.Unquote(getETag.ETag)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("carddav: failed to unquote ETag: %v", err)
|
||||
}
|
||||
|
||||
r := bytes.NewReader(addrData.Data)
|
||||
card, err := vcard.NewDecoder(r).Decode()
|
||||
@ -236,7 +231,7 @@ func decodeAddressList(ms *internal.Multistatus) ([]AddressObject, error) {
|
||||
addrs = append(addrs, AddressObject{
|
||||
Path: path,
|
||||
ModTime: time.Time(getLastMod.LastModified),
|
||||
ETag: etag,
|
||||
ETag: string(getETag.ETag),
|
||||
Card: card,
|
||||
})
|
||||
}
|
||||
|
@ -372,7 +372,7 @@ func (b *backend) propfindAddressObject(propfind *internal.Propfind, ao *Address
|
||||
|
||||
if ao.ETag != "" {
|
||||
props[internal.GetETagName] = func(*internal.RawXMLValue) (interface{}, error) {
|
||||
return &internal.GetETag{ETag: fmt.Sprintf("%q", ao.ETag)}, nil
|
||||
return &internal.GetETag{ETag: internal.ETag(ao.ETag)}, nil
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4,7 +4,6 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/emersion/go-webdav/internal"
|
||||
@ -88,15 +87,11 @@ func fileInfoFromResponse(resp *internal.Response) (*FileInfo, error) {
|
||||
if err := resp.DecodeProp(&getETag); err != nil && !internal.IsNotFound(err) {
|
||||
return nil, err
|
||||
}
|
||||
etag, err := strconv.Unquote(getETag.ETag)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("webdav: failed to unquote ETag: %v", err)
|
||||
}
|
||||
|
||||
fi.Size = getLen.Length
|
||||
fi.ModTime = time.Time(getMod.LastModified)
|
||||
fi.MIMEType = getType.Type
|
||||
fi.ETag = etag
|
||||
fi.ETag = string(getETag.ETag)
|
||||
}
|
||||
|
||||
return fi, nil
|
||||
|
@ -342,7 +342,26 @@ type GetLastModified struct {
|
||||
// https://tools.ietf.org/html/rfc4918#section-15.6
|
||||
type GetETag struct {
|
||||
XMLName xml.Name `xml:"DAV: getetag"`
|
||||
ETag string `xml:",chardata"`
|
||||
ETag ETag `xml:",chardata"`
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
*etag = ETag(s)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (etag *ETag) MarshalText() ([]byte, error) {
|
||||
return []byte(fmt.Sprintf("%q", *etag)), nil
|
||||
}
|
||||
|
||||
func (etag ETag) String() string {
|
||||
return string(etag)
|
||||
}
|
||||
|
||||
// https://tools.ietf.org/html/rfc4918#section-14.5
|
||||
|
@ -2,7 +2,6 @@ package webdav
|
||||
|
||||
import (
|
||||
"encoding/xml"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"os"
|
||||
@ -93,7 +92,7 @@ func (b *backend) HeadGet(w http.ResponseWriter, r *http.Request) error {
|
||||
w.Header().Set("Last-Modified", fi.ModTime.UTC().Format(http.TimeFormat))
|
||||
}
|
||||
if fi.ETag != "" {
|
||||
w.Header().Set("ETag", fmt.Sprintf("%q", fi.ETag))
|
||||
w.Header().Set("ETag", internal.ETag(fi.ETag).String())
|
||||
}
|
||||
|
||||
if rs, ok := f.(io.ReadSeeker); ok {
|
||||
@ -174,7 +173,7 @@ func (b *backend) propfindFile(propfind *internal.Propfind, fi *FileInfo) (*inte
|
||||
|
||||
if fi.ETag != "" {
|
||||
props[internal.GetETagName] = func(*internal.RawXMLValue) (interface{}, error) {
|
||||
return &internal.GetETag{ETag: fmt.Sprintf("%q", fi.ETag)}, nil
|
||||
return &internal.GetETag{ETag: internal.ETag(fi.ETag)}, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user