Merge branch '21606-keep-web-output-buffer'
[arvados.git] / services / keep-web / handler.go
index 12c2839f8ca78fab56e8111efc2d3111e4bd02b0..cdd51f0bb7c7fcee60dd21970192fbd3a65aa6d0 100644 (file)
@@ -34,6 +34,7 @@ import (
 type handler struct {
        Cache   cache
        Cluster *arvados.Cluster
+       metrics *metrics
 
        lockMtx    sync.Mutex
        lock       map[string]*sync.RWMutex
@@ -177,7 +178,12 @@ func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) {
                r.URL.Scheme = xfp
        }
 
-       w := httpserver.WrapResponseWriter(wOrig)
+       wbuffer := newWriteBuffer(wOrig, int(h.Cluster.Collections.WebDAVOutputBuffer))
+       defer wbuffer.Close()
+       w := httpserver.WrapResponseWriter(responseWriter{
+               Writer:         wbuffer,
+               ResponseWriter: wOrig,
+       })
 
        if r.Method == "OPTIONS" && ServeCORSPreflight(w, r.Header) {
                return
@@ -592,7 +598,7 @@ func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) {
        if webdavPrefix == "" {
                webdavPrefix = "/" + strings.Join(pathParts[:stripParts], "/")
        }
-       wh := webdav.Handler{
+       wh := &webdav.Handler{
                Prefix: webdavPrefix,
                FileSystem: &webdavfs.FS{
                        FileSystem:    sessionFS,
@@ -607,7 +613,7 @@ func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) {
                        }
                },
        }
-       wh.ServeHTTP(w, r)
+       h.metrics.track(wh, w, r)
        if r.Method == http.MethodGet && w.WroteStatus() == http.StatusOK {
                wrote := int64(w.WroteBodyBytes())
                fnm := strings.Join(pathParts[stripParts:], "/")