From d7cc883cbb4eff76e8e4a8970b123f45dc2eaa31 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sun, 1 Apr 2018 20:02:53 +0200 Subject: [PATCH] * Fix URL for CalDAV if necessary * Implemented upload and delete of CalDAV items --- src/calanonsync/caldav.go | 50 +++++++++++++++++++++++++++++++++++++ src/calanonsync/settings.go | 6 +++++ 2 files changed, 56 insertions(+) diff --git a/src/calanonsync/caldav.go b/src/calanonsync/caldav.go index b44afd9..5253384 100644 --- a/src/calanonsync/caldav.go +++ b/src/calanonsync/caldav.go @@ -4,9 +4,11 @@ import ( "bufio" "encoding/xml" "errors" + "fmt" "io" "log" "net/http" + "net/url" "strings" "text/template" "time" @@ -174,6 +176,54 @@ func (c *CalDAV) GetEvents() ([]CalDAVItem, error) { return result, nil } +func (c CalDAV) UploadItem(item CalDAVItem) error { + itemURL, _ := url.Parse(item.HRef) + base, _ := url.Parse(c.URL) + + // Build the absolute URL for the item + itemURL = base.ResolveReference(itemURL) + + req, err := http.NewRequest("PUT", itemURL.String(), strings.NewReader(item.ICal.String())) + if err != nil { + return err + } + req.SetBasicAuth(c.Username, c.Password) + resp, err := c.httpClient.Do(req) + if err != nil { + return err + } + + if resp.StatusCode >= 300 { + return fmt.Errorf("Unexpected result while uploading %s: %d", itemURL.String(), resp.StatusCode) + } + + return nil +} + +func (c CalDAV) DeleteItem(item CalDAVItem) error { + itemURL, _ := url.Parse(item.HRef) + base, _ := url.Parse(c.URL) + + // Build the absolute URL for the item + itemURL = base.ResolveReference(itemURL) + + req, err := http.NewRequest("DELETE", itemURL.String(), nil) + if err != nil { + return err + } + req.SetBasicAuth(c.Username, c.Password) + resp, err := c.httpClient.Do(req) + if err != nil { + return err + } + + if resp.StatusCode >= 300 { + return fmt.Errorf("Unexpected result while deleting %s: %d", itemURL.String(), resp.StatusCode) + } + + return nil +} + type MultiStatus struct { Response []PropFindResponse `xml:"response"` } diff --git a/src/calanonsync/settings.go b/src/calanonsync/settings.go index 19734c8..4c87579 100644 --- a/src/calanonsync/settings.go +++ b/src/calanonsync/settings.go @@ -3,6 +3,7 @@ package main import ( "encoding/json" "os" + "strings" ) type ServerSettings struct { @@ -29,5 +30,10 @@ func LoadSettings() Settings { if err != nil { panic(err) } + + if settings.CalDAV.URL != "" && strings.HasSuffix(settings.CalDAV.URL, "/") { + settings.CalDAV.URL += "/" + } + return settings }