diff --git a/middleware/browse/browse.go b/middleware/browse/browse.go index eb941332..321033d5 100644 --- a/middleware/browse/browse.go +++ b/middleware/browse/browse.go @@ -3,6 +3,7 @@ package browse import ( + "bytes" "fmt" "html/template" "io/ioutil" @@ -122,8 +123,6 @@ func (b Browse) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { } defer file.Close() - w.Header().Set("Content-Type", "text/html; charset=utf-8") - files, err := file.Readdir(-1) if err != nil { return http.StatusForbidden, err @@ -182,11 +181,14 @@ func (b Browse) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { Items: fileinfos, } - // TODO: Don't write to w until we know there wasn't an error - err = bc.Template.Execute(w, listing) + // TODO: Use pooled buffers to reduce allocations + var buf bytes.Buffer + err = bc.Template.Execute(&buf, listing) if err != nil { return http.StatusInternalServerError, err } + w.Header().Set("Content-Type", "text/html; charset=utf-8") + buf.WriteTo(w) return http.StatusOK, nil } diff --git a/middleware/templates/templates.go b/middleware/templates/templates.go index e641fd7d..16678833 100644 --- a/middleware/templates/templates.go +++ b/middleware/templates/templates.go @@ -1,6 +1,7 @@ package templates import ( + "bytes" "net/http" "path" "text/template" @@ -47,10 +48,13 @@ func (t Templates) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error } // Execute it - err = tpl.Execute(w, ctx) + // TODO: Use pooled buffers to reduce allocations + var buf bytes.Buffer + err = bc.Template.Execute(&buf, ctx) if err != nil { return http.StatusInternalServerError, err } + buf.WriteTo(w) return http.StatusOK, nil }