From 62ce7e189e5a2f2399e98e725a74ce45e69b69ee Mon Sep 17 00:00:00 2001 From: ginuerzh Date: Sun, 31 May 2026 18:02:13 +0800 Subject: [PATCH] fix(forwarder/sniffer_http): clone response header map and sync request header to recorder Fix two data races in Sniffer.httpRoundTrip: - resp.Header was assigned directly to ro.HTTP.Response.Header without cloning, creating shared mutable state between the response and recorder. - httpSettings.RequestHeader was set on req.Header but not propagated to ro.HTTP.Request.Header, causing the recorder to miss configured headers. --- internal/util/forwarder/sniffer_http.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/util/forwarder/sniffer_http.go b/internal/util/forwarder/sniffer_http.go index e7976c3f..8ecf85d6 100644 --- a/internal/util/forwarder/sniffer_http.go +++ b/internal/util/forwarder/sniffer_http.go @@ -311,6 +311,7 @@ func (h *Sniffer) httpRoundTrip(ctx context.Context, rw, cc io.ReadWriteCloser, } for k, v := range httpSettings.RequestHeader { req.Header.Set(k, v) + ro.HTTP.Request.Header = req.Header.Clone() } for _, re := range httpSettings.RewriteURL { @@ -372,7 +373,7 @@ func (h *Sniffer) httpRoundTrip(ctx context.Context, rw, cc io.ReadWriteCloser, } ro.HTTP.StatusCode = resp.StatusCode - ro.HTTP.Response.Header = resp.Header + ro.HTTP.Response.Header = resp.Header.Clone() ro.HTTP.Response.ContentLength = resp.ContentLength if log.IsLevelEnabled(logger.TraceLevel) {