~/Projects/webdav-go
git clone https://code.lsong.org/webdav-go
Commit
- Commit
- 7dafedd290d3c9721684f72c1c50629366042567
- Author
- Conrad Hoffmann <[email protected]>
- Date
- 2022-03-31 12:30:14 +0200 +0200
- Diffstat
caldav/server.go | 33 +++++++++++++++++++++++++++++++++
Add type-safe precondition errors for CalDAV
diff --git a/caldav/server.go b/caldav/server.go index 927d197c2eedae2d4c7f129148c0cc7cf0b46458..b0ea30166cf624586eb69d1ef876e4120697fc34 100644 --- a/caldav/server.go +++ b/caldav/server.go @@ -3,6 +3,7 @@ import ( "context" "encoding/xml" + "fmt" "net/http" "time" @@ -270,3 +271,35 @@ func (b *backend) Move(r *http.Request, dest *internal.Href, overwrite bool) (created bool, err error) { panic("TODO") } + +// https://datatracker.ietf.org/doc/html/rfc4791#section-5.3.2.1 +type PreconditionType string + +const ( + PreconditionNoUIDConflict PreconditionType = "no-uid-conflict" + PreconditionSupportedCalendarData PreconditionType = "supported-calendar-data" + PreconditionSupportedCalendarComponent PreconditionType = "supported-calendar-component" + PreconditionValidCalendarData PreconditionType = "valid-calendar-data" + PreconditionValidCalendarObjectResource PreconditionType = "valid-calendar-object-resource" + PreconditionCalendarCollectionLocationOk PreconditionType = "calendar-collection-location-ok" + PreconditionMaxResourceSize PreconditionType = "max-resource-size" + PreconditionMinDateTime PreconditionType = "min-date-time" + PreconditionMaxDateTime PreconditionType = "max-date-time" + PreconditionMaxInstances PreconditionType = "max-instances" + PreconditionMaxAttendeesPerInstance PreconditionType = "max-attendees-per-instance" +) + +func NewPreconditionError(err PreconditionType) error { + name := xml.Name{"urn:ietf:params:xml:ns:caldav", string(err)} + elem := internal.NewRawXMLElement(name, nil, nil) + e := internal.Error{ + Raw: []internal.RawXMLValue{ + *elem, + }, + } + return &internal.DAVError{ + Code: 409, + Msg: fmt.Sprintf("precondition not met: %s", string(err)), + Err: e, + } +}