From 482464c2affc5eeba5d4a25bb272aeb352ec5918 Mon Sep 17 00:00:00 2001 From: awaae <108462724+awaae001@users.noreply.github.com> Date: Sat, 10 Oct 2026 12:54:23 +0900 Subject: [PATCH] fix(net): handle gzip reader error on error response decoding (#3179) - Defer closing response body when handling HTTP error responses - Check error when initializing `gzip.Reader` to prevent panics from invalid gzip streams - Avoid unsafe type assertion during gzip reader cleanup --- internal/net/serve.go | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/internal/net/serve.go b/internal/net/serve.go index a16a4bd7..fe1a4a7e 100644 --- a/internal/net/serve.go +++ b/internal/net/serve.go @@ -302,20 +302,18 @@ func RequestHttp(ctx context.Context, httpMethod string, headerOverride http.Hea } // TODO clean header with blocklist or passlist res.Header.Del("set-cookie") - var reader io.Reader if res.StatusCode >= 400 { - // 根据 Content-Encoding 判断 Body 是否压缩 - switch res.Header.Get("Content-Encoding") { - case "gzip": - // 使用gzip.NewReader解压缩 - reader, _ = gzip.NewReader(res.Body) - defer reader.(*gzip.Reader).Close() - default: - // 没有Content-Encoding,直接读取 - reader = res.Body + defer res.Body.Close() + var reader io.Reader = res.Body + if res.Header.Get("Content-Encoding") == "gzip" { + gzipReader, err := gzip.NewReader(res.Body) + if err != nil { + return nil, fmt.Errorf("http request [%s] failure,status: %w decode gzip response: %v", URL, HttpStatusCodeError(res.StatusCode), err) + } + defer gzipReader.Close() + reader = gzipReader } all, _ := io.ReadAll(reader) - _ = res.Body.Close() msg := string(all) log.Debugln(msg) return nil, fmt.Errorf("http request [%s] failure,status: %w response:%s", URL, HttpStatusCodeError(res.StatusCode), msg)