From 4509622dde39fd9abc4f9e632814d0c336b46fcb Mon Sep 17 00:00:00 2001 From: yusing Date: Sat, 13 Sep 2025 23:26:10 +0800 Subject: [PATCH] fix(reverseproxy): properly suppress http2.errStreamClosed --- internal/net/gphttp/reverseproxy/reverse_proxy.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/internal/net/gphttp/reverseproxy/reverse_proxy.go b/internal/net/gphttp/reverseproxy/reverse_proxy.go index e87a7209..d8b31e03 100644 --- a/internal/net/gphttp/reverseproxy/reverse_proxy.go +++ b/internal/net/gphttp/reverseproxy/reverse_proxy.go @@ -33,6 +33,8 @@ import ( U "github.com/yusing/go-proxy/internal/utils" "golang.org/x/net/http/httpguts" "golang.org/x/net/http2" + + _ "unsafe" ) // A ProxyRequest contains a request to be rewritten by a [ReverseProxy]. @@ -169,6 +171,9 @@ func copyHeader(dst, src http.Header) { } } +//go:linkname errStreamClosed golang.org/x/net/http2.errStreamClosed +var errStreamClosed error + func (p *ReverseProxy) errorHandler(rw http.ResponseWriter, r *http.Request, err error, writeHeader bool) { reqURL := r.Host + r.URL.Path switch { @@ -186,6 +191,9 @@ func (p *ReverseProxy) errorHandler(rw http.ResponseWriter, r *http.Request, err log.Err(err).Msg("underlying error") goto logged } + if errors.Is(err, errStreamClosed) { + goto logged + } var h2Err http2.StreamError if errors.As(err, &h2Err) { // ignore these errors