diff --git a/carddav/carddav.go b/carddav/carddav.go index f7dbf8e..ae04f61 100644 --- a/carddav/carddav.go +++ b/carddav/carddav.go @@ -19,10 +19,13 @@ type AddressBook struct { type AddressBookQuery struct { Props []string AllProp bool + + Limit int // <= 0 means unlimited } type AddressBookMultiGet struct { - Paths []string + Paths []string + Props []string AllProp bool } diff --git a/carddav/client.go b/carddav/client.go index 0471d72..9088935 100644 --- a/carddav/client.go +++ b/carddav/client.go @@ -215,6 +215,9 @@ func (c *Client) QueryAddressBook(addressBook string, query *AddressBookQuery) ( } addressbookQuery := addressbookQuery{Prop: propReq} + if query.Limit > 0 { + addressbookQuery.Limit = &limit{NResults: uint(query.Limit)} + } req, err := c.ic.NewXMLRequest("REPORT", addressBook, &addressbookQuery) if err != nil { diff --git a/carddav/server.go b/carddav/server.go index 671d3d4..07e4533 100644 --- a/carddav/server.go +++ b/carddav/server.go @@ -80,6 +80,12 @@ func (h *Handler) handleQuery(w http.ResponseWriter, query *addressbookQuery) er q.Props = append(q.Props, p.Name) } } + if query.Limit != nil { + q.Limit = int(query.Limit.NResults) + if q.Limit <= 0 { + return internal.ServeMultistatus(w, internal.NewMultistatus()) + } + } aos, err := h.Backend.QueryAddressObjects(&q) if err != nil {