fix:introduce buffered response writer for webdav, fix status/error return failed. (#2544)

* fix: introduce buffered response writer for webdav, fix webdav status/error return failed.

* fix: bypass buffered writer for GET/HEAD/POST requests
This commit is contained in:
Ovear
2022-12-02 17:59:59 +08:00
committed by GitHub
parent ae791c8634
commit 0838feeb82
2 changed files with 60 additions and 9 deletions

View File

@ -45,30 +45,33 @@ func (h *Handler) stripPrefix(p string) (string, int, error) {
func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
status, err := http.StatusBadRequest, errUnsupportedMethod
brw := newBufferedResponseWriter()
useBufferedWriter := true
if h.LockSystem == nil {
status, err = http.StatusInternalServerError, errNoLockSystem
} else {
switch r.Method {
case "OPTIONS":
status, err = h.handleOptions(w, r)
status, err = h.handleOptions(brw, r)
case "GET", "HEAD", "POST":
useBufferedWriter = false
status, err = h.handleGetHeadPost(w, r)
case "DELETE":
status, err = h.handleDelete(w, r)
status, err = h.handleDelete(brw, r)
case "PUT":
status, err = h.handlePut(w, r)
status, err = h.handlePut(brw, r)
case "MKCOL":
status, err = h.handleMkcol(w, r)
status, err = h.handleMkcol(brw, r)
case "COPY", "MOVE":
status, err = h.handleCopyMove(w, r)
status, err = h.handleCopyMove(brw, r)
case "LOCK":
status, err = h.handleLock(w, r)
status, err = h.handleLock(brw, r)
case "UNLOCK":
status, err = h.handleUnlock(w, r)
status, err = h.handleUnlock(brw, r)
case "PROPFIND":
status, err = h.handlePropfind(w, r)
status, err = h.handlePropfind(brw, r)
case "PROPPATCH":
status, err = h.handleProppatch(w, r)
status, err = h.handleProppatch(brw, r)
}
}
@ -77,6 +80,8 @@ func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if status != http.StatusNoContent {
w.Write([]byte(StatusText(status)))
}
} else if useBufferedWriter {
brw.WriteToResponse(w)
}
if h.Logger != nil && err != nil {
h.Logger(r, err)