From b043bbd9657b2c47250648db9889d78295f7da27 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Mon, 8 Jan 2024 14:58:24 +0100 Subject: [PATCH] internal/server: handle PROPFIND without body See RFC 4918 section 9.1. --- internal/server.go | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/internal/server.go b/internal/server.go index dd01b3e..f9c7b68 100644 --- a/internal/server.go +++ b/internal/server.go @@ -4,6 +4,7 @@ import ( "encoding/xml" "errors" "fmt" + "io" "mime" "net/http" "net/url" @@ -27,9 +28,13 @@ func ServeError(w http.ResponseWriter, err error) { http.Error(w, err.Error(), code) } +func isContentXML(h http.Header) bool { + t, _, _ := mime.ParseMediaType(h.Get("Content-Type")) + return t == "application/xml" || t == "text/xml" +} + func DecodeXMLRequest(r *http.Request, v interface{}) error { - t, _, _ := mime.ParseMediaType(r.Header.Get("Content-Type")) - if t != "application/xml" && t != "text/xml" { + if !isContentXML(r.Header) { return HTTPErrorf(http.StatusBadRequest, "webdav: expected application/xml request") } @@ -131,8 +136,16 @@ func (h *Handler) handleOptions(w http.ResponseWriter, r *http.Request) error { func (h *Handler) handlePropfind(w http.ResponseWriter, r *http.Request) error { var propfind PropFind - if err := DecodeXMLRequest(r, &propfind); err != nil { - return err + if isContentXML(r.Header) { + if err := DecodeXMLRequest(r, &propfind); err != nil { + return err + } + } else { + var b [1]byte + if _, err := r.Body.Read(b[:]); err != io.EOF { + return HTTPErrorf(http.StatusBadRequest, "webdav: unsupported request body") + } + propfind.AllProp = &struct{}{} } depth := DepthInfinity