From 6e0ea58de1944fc98de93ff348cad910939640fc Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Sun, 19 Jan 2020 15:29:51 +0100 Subject: [PATCH] carddav: populate AddressBook.{Name,MaxResourceSize} in client --- carddav/client.go | 29 +++++++++++++++++++++++++---- carddav/elements.go | 8 ++++---- internal/elements.go | 2 +- internal/server.go | 4 ++++ 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/carddav/client.go b/carddav/client.go index c6fe2e8..90271bc 100644 --- a/carddav/client.go +++ b/carddav/client.go @@ -2,6 +2,7 @@ package carddav import ( "bytes" + "fmt" "net/http" "github.com/emersion/go-vcard" @@ -48,7 +49,12 @@ func (c *Client) FindAddressBookHomeSet(principal string) (string, error) { } func (c *Client) FindAddressBooks(addressBookHomeSet string) ([]AddressBook, error) { - propfind := internal.NewPropNamePropfind(internal.ResourceTypeName, addressBookDescriptionName) + propfind := internal.NewPropNamePropfind( + internal.ResourceTypeName, + internal.DisplayNameName, + addressBookDescriptionName, + maxResourceSizeName, + ) ms, err := c.ic.Propfind(addressBookHomeSet, internal.DepthOne, propfind) if err != nil { return nil, err @@ -70,13 +76,28 @@ func (c *Client) FindAddressBooks(addressBookHomeSet string) ([]AddressBook, err } var descProp addressbookDescription - if err := resp.DecodeProp(&descProp); err != nil { + if err := resp.DecodeProp(&descProp); err != nil && !internal.IsNotFound(err) { return nil, err } + var dispNameProp internal.DisplayName + if err := resp.DecodeProp(&dispNameProp); err != nil && !internal.IsNotFound(err) { + return nil, err + } + + var maxResSize maxResourceSize + if err := resp.DecodeProp(&maxResSize); err != nil && !internal.IsNotFound(err) { + return nil, err + } + if maxResSize.Size < 0 { + return nil, fmt.Errorf("carddav: max-resource-size must be a positive integer") + } + l = append(l, AddressBook{ - Href: href, - Description: descProp.Description, + Href: href, + Name: dispNameProp.Name, + Description: descProp.Description, + MaxResourceSize: maxResSize.Size, }) } diff --git a/carddav/elements.go b/carddav/elements.go index 6664b0c..49f7b78 100644 --- a/carddav/elements.go +++ b/carddav/elements.go @@ -14,13 +14,13 @@ var ( addressBookName = xml.Name{namespace, "addressbook"} addressBookDescriptionName = xml.Name{namespace, "addressbook-description"} - addressBookQueryName = xml.Name{namespace, "addressbook-query"} - addressBookMultigetName = xml.Name{namespace, "addressbook-multiget"} addressBookSupportedAddressData = xml.Name{namespace, "addressbook-supported-address-data"} + maxResourceSizeName = xml.Name{namespace, "max-resource-size"} + + addressBookQueryName = xml.Name{namespace, "addressbook-query"} + addressBookMultigetName = xml.Name{namespace, "addressbook-multiget"} addressDataName = xml.Name{namespace, "address-data"} - - maxResourceSizeName = xml.Name{namespace, "max-resource-size"} ) // https://tools.ietf.org/html/rfc6352#section-6.2.3 diff --git a/internal/elements.go b/internal/elements.go index fe14fd5..ccd9280 100644 --- a/internal/elements.go +++ b/internal/elements.go @@ -50,7 +50,7 @@ func (s *Status) Err() error { // TODO: handle 2xx, 3xx if s.Code != http.StatusOK { - return fmt.Errorf("webdav: HTTP error: %v %v", s.Code, s.Text) + return &HTTPError{Code: s.Code} } return nil } diff --git a/internal/server.go b/internal/server.go index 584c0cb..4dbfdf9 100644 --- a/internal/server.go +++ b/internal/server.go @@ -24,6 +24,10 @@ func HTTPErrorFromError(err error) *HTTPError { } } +func IsNotFound(err error) bool { + return HTTPErrorFromError(err).Code == http.StatusNotFound +} + func HTTPErrorf(code int, format string, a ...interface{}) *HTTPError { return &HTTPError{code, fmt.Errorf(format, a...)} }