From 7bb9b3aa0b6fb874377a0a1a91e04eb11811bfa9 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Mon, 24 Feb 2020 18:13:24 +0100 Subject: [PATCH] caldav: add Client.PutCalendarObject --- caldav/client.go | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 63 insertions(+), 3 deletions(-) diff --git a/caldav/client.go b/caldav/client.go index 1155703..c3771f0 100644 --- a/caldav/client.go +++ b/caldav/client.go @@ -3,6 +3,9 @@ package caldav import ( "bytes" "fmt" + "net/http" + "net/url" + "strconv" "time" "github.com/emersion/go-ical" @@ -211,3 +214,60 @@ func (c *Client) QueryCalendar(calendar string, query *CalendarQuery) ([]Calenda return decodeCalendarObjectList(ms) } + +func populateCalendarObject(co *CalendarObject, resp *http.Response) error { + if loc := resp.Header.Get("Location"); loc != "" { + u, err := url.Parse(loc) + if err != nil { + return err + } + co.Path = u.Path + } + if etag := resp.Header.Get("ETag"); etag != "" { + etag, err := strconv.Unquote(etag) + if err != nil { + return err + } + co.ETag = etag + } + if lastModified := resp.Header.Get("Last-Modified"); lastModified != "" { + t, err := http.ParseTime(lastModified) + if err != nil { + return err + } + co.ModTime = t + } + + return nil +} + +func (c *Client) PutCalendarObject(path string, cal *ical.Calendar) (*CalendarObject, error) { + // TODO: add support for If-None-Match and If-Match + + // TODO: some servers want a Content-Length header, so we can't stream the + // request body here. See the Radicale issue: + // https://github.com/Kozea/Radicale/issues/1016 + + var buf bytes.Buffer + if err := ical.NewEncoder(&buf).EncodeCalendar(cal); err != nil { + return nil, err + } + + req, err := c.ic.NewRequest(http.MethodPut, path, &buf) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", ical.MIMEType) + + resp, err := c.ic.Do(req) + if err != nil { + return nil, err + } + resp.Body.Close() + + co := &CalendarObject{Path: path} + if err := populateCalendarObject(co, resp); err != nil { + return nil, err + } + return co, nil +} diff --git a/go.mod b/go.mod index 0c4f6f2..46c265b 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,6 @@ module github.com/emersion/go-webdav go 1.13 require ( - github.com/emersion/go-ical v0.0.0-20200224161826-aa4584e92c62 + github.com/emersion/go-ical v0.0.0-20200224170602-c9b8621220bc github.com/emersion/go-vcard v0.0.0-20191221110513-5f81fa0d3cc7 ) diff --git a/go.sum b/go.sum index 1ccff55..c17f351 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,4 @@ -github.com/emersion/go-ical v0.0.0-20200224161826-aa4584e92c62 h1:kP9BxopsBc1jfYfHgbgnDBJeCfZt9GkyWXFmNOcRsps= -github.com/emersion/go-ical v0.0.0-20200224161826-aa4584e92c62/go.mod h1:4xVTBPcT43a1pp3vdaa+FuRdX5XhKCZPpWv7m0z9ByM= +github.com/emersion/go-ical v0.0.0-20200224170602-c9b8621220bc h1:kpISLFxf4eYcslxD/XkzE2Su7UQdNKt0XYgnN6MEUxg= +github.com/emersion/go-ical v0.0.0-20200224170602-c9b8621220bc/go.mod h1:4xVTBPcT43a1pp3vdaa+FuRdX5XhKCZPpWv7m0z9ByM= github.com/emersion/go-vcard v0.0.0-20191221110513-5f81fa0d3cc7 h1:SE+tcd+0kn0cT4MqTo66gmkjqWHF1Z+Yha5/rhLs/H8= github.com/emersion/go-vcard v0.0.0-20191221110513-5f81fa0d3cc7/go.mod h1:HMJKR5wlh/ziNp+sHEDV2ltblO4JD2+IdDOWtGcQBTM=