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 }