From baf774f9274b4f04c4bae75cf7636b24356e7757 Mon Sep 17 00:00:00 2001 From: yusing Date: Sun, 26 Oct 2025 23:16:38 +0800 Subject: [PATCH] fix(middleware): properly release buffer on error and not to reuse `content` for bytes.Buffer --- internal/net/gphttp/middleware/modify_html.go | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/internal/net/gphttp/middleware/modify_html.go b/internal/net/gphttp/middleware/modify_html.go index d4866d1f..4d3ab116 100644 --- a/internal/net/gphttp/middleware/modify_html.go +++ b/internal/net/gphttp/middleware/modify_html.go @@ -52,13 +52,13 @@ func (m *modifyHTML) modifyResponse(resp *http.Response) error { // NOTE: do not put it in the defer, it will be used as resp.Body content, release, err := httputils.ReadAllBody(resp) + resp.Body.Close() if err != nil { log.Err(err).Str("url", fullURL(resp.Request)).Msg("failed to read response body") - resp.Body.Close() + release(content) resp.Body = eofReader{} return err } - resp.Body.Close() doc, err := goquery.NewDocumentFromReader(bytes.NewReader(content)) if err != nil { @@ -83,7 +83,11 @@ func (m *modifyHTML) modifyResponse(resp *http.Response) error { ele.First().AppendHtml(m.HTML) } - buf := bytes.NewBuffer(content[:0]) + // should not use content (from sized pool) directly for bytes.Buffer + buf := m.bytesPool.GetBuffer() + buf.Write(content) + release(content) + err = buildHTML(doc, buf) if err != nil { log.Err(err).Str("url", fullURL(resp.Request)).Msg("failed to build html") @@ -95,8 +99,7 @@ func (m *modifyHTML) modifyResponse(resp *http.Response) error { resp.Header.Set("Content-Length", strconv.Itoa(buf.Len())) resp.Header.Set("Content-Type", "text/html; charset=utf-8") resp.Body = readerWithRelease(buf.Bytes(), func(_ []byte) { - // release content, not buf.Bytes() - release(content) + m.bytesPool.PutBuffer(buf) }) return nil }