From fa016ab8659608683ca7378448e8ab15e5c58335 Mon Sep 17 00:00:00 2001 From: logikonline Date: Mon, 16 Mar 2026 03:19:33 -0400 Subject: [PATCH] perf(pages): stream asset files instead of buffering in memory Replace full-file buffering with io.Copy streaming in serveRepoFileAsset. Reduces memory usage for large assets (images, videos) by streaming directly from git blob to HTTP response. Adds Content-Length header for better client handling. --- routers/web/pages/pages.go | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/routers/web/pages/pages.go b/routers/web/pages/pages.go index 37e81ef7ec..88cfc7461b 100644 --- a/routers/web/pages/pages.go +++ b/routers/web/pages/pages.go @@ -843,15 +843,9 @@ func serveRepoFileAsset(ctx *context.Context, commit *git.Commit, assetPath stri ctx.Resp.Header().Set("Content-Type", contentType) ctx.Resp.Header().Set("Cache-Control", "public, max-age=3600") - // Stream content - content := make([]byte, entry.Blob().Size()) - _, err = reader.Read(content) - if err != nil && err.Error() != "EOF" { - ctx.ServerError("Failed to read asset", err) - return - } - - _, _ = ctx.Resp.Write(content) + // Stream content directly to the response + ctx.Resp.Header().Set("Content-Length", strconv.FormatInt(entry.Blob().Size(), 10)) + _, _ = io.Copy(ctx.Resp, reader) } // servePageEvent handles POST /pages/events for A/B test event tracking