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:
46
server/webdav/buffered_response_writer.go
Normal file
46
server/webdav/buffered_response_writer.go
Normal file
@ -0,0 +1,46 @@
|
||||
package webdav
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
)
|
||||
|
||||
type bufferedResponseWriter struct {
|
||||
statusCode int
|
||||
data []byte
|
||||
header http.Header
|
||||
}
|
||||
|
||||
func (w *bufferedResponseWriter) Header() http.Header {
|
||||
if w.header == nil {
|
||||
w.header = make(http.Header)
|
||||
}
|
||||
return w.header
|
||||
}
|
||||
|
||||
func (w *bufferedResponseWriter) Write(bytes []byte) (int, error) {
|
||||
w.data = append(w.data, bytes...)
|
||||
return len(bytes), nil
|
||||
}
|
||||
|
||||
func (w *bufferedResponseWriter) WriteHeader(statusCode int) {
|
||||
if w.statusCode == 0 {
|
||||
w.statusCode = statusCode
|
||||
}
|
||||
}
|
||||
|
||||
func (w *bufferedResponseWriter) WriteToResponse(rw http.ResponseWriter) (int, error) {
|
||||
h := rw.Header()
|
||||
for k, vs := range w.header {
|
||||
for _, v := range vs {
|
||||
h.Add(k, v)
|
||||
}
|
||||
}
|
||||
rw.WriteHeader(w.statusCode)
|
||||
return rw.Write(w.data)
|
||||
}
|
||||
|
||||
func newBufferedResponseWriter() *bufferedResponseWriter {
|
||||
return &bufferedResponseWriter{
|
||||
statusCode: 0,
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user