internal/server: handle PROPFIND without body

See RFC 4918 section 9.1.
This commit is contained in:
Simon Ser 2024-01-08 14:58:24 +01:00
parent 75d3041b41
commit b043bbd965

View File

@ -4,6 +4,7 @@ import (
"encoding/xml" "encoding/xml"
"errors" "errors"
"fmt" "fmt"
"io"
"mime" "mime"
"net/http" "net/http"
"net/url" "net/url"
@ -27,9 +28,13 @@ func ServeError(w http.ResponseWriter, err error) {
http.Error(w, err.Error(), code) 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 { func DecodeXMLRequest(r *http.Request, v interface{}) error {
t, _, _ := mime.ParseMediaType(r.Header.Get("Content-Type")) if !isContentXML(r.Header) {
if t != "application/xml" && t != "text/xml" {
return HTTPErrorf(http.StatusBadRequest, "webdav: expected application/xml request") return HTTPErrorf(http.StatusBadRequest, "webdav: expected application/xml request")
} }
@ -131,9 +136,17 @@ func (h *Handler) handleOptions(w http.ResponseWriter, r *http.Request) error {
func (h *Handler) handlePropfind(w http.ResponseWriter, r *http.Request) error { func (h *Handler) handlePropfind(w http.ResponseWriter, r *http.Request) error {
var propfind PropFind var propfind PropFind
if isContentXML(r.Header) {
if err := DecodeXMLRequest(r, &propfind); err != nil { if err := DecodeXMLRequest(r, &propfind); err != nil {
return err 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 depth := DepthInfinity
if s := r.Header.Get("Depth"); s != "" { if s := r.Header.Get("Depth"); s != "" {