carddav: add Client.FindAddressBooks

This commit is contained in:
Simon Ser
2020-01-14 23:13:23 +01:00
parent 3d05533a31
commit 9dfabd89c8
6 changed files with 114 additions and 14 deletions

View File

@@ -26,7 +26,7 @@ func NewClient(c *http.Client, endpoint string) (*Client, error) {
return &Client{wc, ic}, nil
}
func (c *Client) FindAddressbookHomeSet(principal string) (string, error) {
func (c *Client) FindAddressBookHomeSet(principal string) (string, error) {
name := xml.Name{namespace, "addressbook-home-set"}
propfind := internal.NewPropPropfind(name)
@@ -42,3 +42,50 @@ func (c *Client) FindAddressbookHomeSet(principal string) (string, error) {
return prop.Href, nil
}
func (c *Client) FindAddressBooks(addressBookHomeSet string) ([]AddressBook, error) {
resTypeName := xml.Name{"DAV:", "resourcetype"}
descName := xml.Name{namespace, "addressbook-description"}
propfind := internal.NewPropPropfind(resTypeName, descName)
req, err := c.ic.NewXMLRequest("PROPFIND", addressBookHomeSet, propfind)
if err != nil {
return nil, err
}
req.Header.Add("Depth", "1")
ms, err := c.ic.DoMultiStatus(req)
if err != nil {
return nil, err
}
l := make([]AddressBook, 0, len(ms.Responses))
for i := range ms.Responses {
resp := &ms.Responses[i]
href, err := resp.Href()
if err != nil {
return nil, err
}
var resTypeProp internal.ResourceType
if err := resp.DecodeProp(resTypeName, &resTypeProp); err != nil {
return nil, err
}
if !resTypeProp.Is(addressBookName) {
continue
}
var descProp addressbookDescription
if err := resp.DecodeProp(descName, &descProp); err != nil {
return nil, err
}
l = append(l, AddressBook{
Href: href,
Description: descProp.Data,
})
}
return l, nil
}