diff --git a/internal/util/forwarder/sniffer.go b/internal/util/forwarder/sniffer.go index bbc0f72c..60f90e8a 100644 --- a/internal/util/forwarder/sniffer.go +++ b/internal/util/forwarder/sniffer.go @@ -470,12 +470,23 @@ func (h *Sniffer) httpRoundTrip(ctx context.Context, rw, cc io.ReadWriter, node return } - xio.SetReadDeadline(cc, time.Now().Add(h.ReadTimeout)) - resp, err := http.ReadResponse(bufio.NewReader(cc), req) - if err != nil { - log.Errorf("read response: %v", err) - res.Write(rw) - return + br := bufio.NewReader(cc) + var resp *http.Response + for { + xio.SetReadDeadline(cc, time.Now().Add(h.ReadTimeout)) + resp, err = http.ReadResponse(br, req) + if err != nil { + log.Errorf("read response: %v", err) + res.Write(rw) + return + } + if resp.StatusCode >= http.StatusContinue && resp.StatusCode < http.StatusOK { + resp.Write(rw) + resp.Body.Close() + continue + } + + break } defer resp.Body.Close() xio.SetReadDeadline(cc, time.Time{}) diff --git a/internal/util/sniffing/sniffer.go b/internal/util/sniffing/sniffer.go index 06146a4b..e1a7eb58 100644 --- a/internal/util/sniffing/sniffer.go +++ b/internal/util/sniffing/sniffer.go @@ -337,11 +337,22 @@ func (h *Sniffer) httpRoundTrip(ctx context.Context, rw, cc io.ReadWriter, req * return } - xio.SetReadDeadline(cc, time.Now().Add(h.ReadTimeout)) - resp, err := http.ReadResponse(bufio.NewReader(cc), req) - if err != nil { - err = fmt.Errorf("read response: %w", err) - return + br := bufio.NewReader(cc) + var resp *http.Response + for { + xio.SetReadDeadline(cc, time.Now().Add(h.ReadTimeout)) + resp, err = http.ReadResponse(br, req) + if err != nil { + err = fmt.Errorf("read response: %v", err) + return + } + if resp.StatusCode >= http.StatusContinue && resp.StatusCode < http.StatusOK { + resp.Write(rw) + resp.Body.Close() + continue + } + + break } defer resp.Body.Close() xio.SetReadDeadline(cc, time.Time{})