diff --git a/server.go b/server.go index 1b18be0..959d789 100644 --- a/server.go +++ b/server.go @@ -189,8 +189,51 @@ func (b *backend) propFindFile(propfind *internal.PropFind, fi *FileInfo) (*inte } func (b *backend) PropPatch(r *http.Request, update *internal.PropertyUpdate) (*internal.Response, error) { - // TODO: return a failed Response instead - return nil, internal.HTTPErrorf(http.StatusForbidden, "webdav: PROPPATCH is unsupported") + fi, err := b.FileSystem.Stat(r.Context(), r.URL.Path) + if err != nil { + return nil, err + } + + resp := &internal.Response{Hrefs: []internal.Href{internal.Href{Path: fi.Path}}} + + for _, set := range update.Set { + for _, raw := range set.Prop.Raw { + xmlName, ok := raw.XMLName() + if !ok { + continue + } + + emptyVal := internal.NewRawXMLElement(xmlName, nil, nil) + + if err := resp.EncodeProp(http.StatusForbidden, emptyVal); err != nil { + return nil, err + } + } + + } + + for _, remove := range update.Remove { + for _, raw := range remove.Prop.Raw { + xmlName, ok := raw.XMLName() + if !ok { + continue + } + + emptyVal := internal.NewRawXMLElement(xmlName, nil, nil) + + if err := resp.EncodeProp(http.StatusForbidden, emptyVal); err != nil { + return nil, err + } + } + + } + + if len(resp.PropStats) == 0 { + return nil, internal.HTTPErrorf(http.StatusBadRequest, + "webdav: request missing properties to update") + } + + return resp, nil } func (b *backend) Put(w http.ResponseWriter, r *http.Request) error {