carddav: add support for getcontentlength property

Allow the backend to provide a value for the `getcontentlength` property
as described in [RFC 2518 section 13.4][1].

The implementation treats is as optional, allthough it is a required
property per RFC. Most clients do perfectly fine without it, though.

Properly setting this in the backend makes the CardDAV collection
listable with clients that do require it, e.g. cadaver.

[1]: https://datatracker.ietf.org/doc/html/rfc2518#section-13.4
This commit is contained in:
Conrad Hoffmann 2022-05-17 15:12:12 +02:00 committed by Simon Ser
parent 9ed4abce57
commit a3e56141d9
2 changed files with 10 additions and 4 deletions

View File

@ -102,6 +102,7 @@ type AddressBookMultiGet struct {
type AddressObject struct {
Path string
ModTime time.Time
ContentLength int64
ETag string
Card vcard.Card
}

View File

@ -441,6 +441,11 @@ func (b *backend) propfindAddressObject(ctx context.Context, propfind *internal.
},
}
if ao.ContentLength > 0 {
props[internal.GetContentLengthName] = func(*internal.RawXMLValue) (interface{}, error) {
return &internal.GetContentLength{Length: ao.ContentLength}, nil
}
}
if !ao.ModTime.IsZero() {
props[internal.GetLastModifiedName] = func(*internal.RawXMLValue) (interface{}, error) {
return &internal.GetLastModified{LastModified: internal.Time(ao.ModTime)}, nil