From 55cd31fb964c208991f5f3e9ea8b6a432999df7a Mon Sep 17 00:00:00 2001 From: hkfires <10558748+hkfires@users.noreply.github.com> Date: Fri, 5 Dec 2025 21:28:05 +0800 Subject: [PATCH] fix(amp): suppress ErrAbortHandler panics in reverse proxy handler --- internal/api/modules/amp/routes.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/internal/api/modules/amp/routes.go b/internal/api/modules/amp/routes.go index 647561b6..57bb5246 100644 --- a/internal/api/modules/amp/routes.go +++ b/internal/api/modules/amp/routes.go @@ -1,6 +1,7 @@ package amp import ( + "errors" "net" "net/http" "net/http/httputil" @@ -113,6 +114,17 @@ func (m *AmpModule) registerManagementRoutes(engine *gin.Engine, baseHandler *ha // Dynamic proxy handler that uses m.getProxy() for hot-reload support proxyHandler := func(c *gin.Context) { + // Swallow ErrAbortHandler panics from ReverseProxy copyResponse to avoid noisy stack traces + defer func() { + if rec := recover(); rec != nil { + if err, ok := rec.(error); ok && errors.Is(err, http.ErrAbortHandler) { + // Upstream already wrote the status (often 404) before the client/stream ended. + return + } + panic(rec) + } + }() + proxy := m.getProxy() if proxy == nil { c.JSON(503, gin.H{"error": "amp upstream proxy not available"})