diff --git a/pkg/proxy/gzip.go b/pkg/proxy/gzip.go new file mode 100644 index 0000000..eb01eb7 --- /dev/null +++ b/pkg/proxy/gzip.go @@ -0,0 +1,35 @@ +package proxy + +import ( + "bytes" + "compress/gzip" + "fmt" + "io" + "net/http" +) + +func gunzipResponseBody(res *http.Response) error { + if res.Header.Get("Content-Encoding") != "gzip" { + return nil + } + + gzipReader, err := gzip.NewReader(res.Body) + if err != nil { + return fmt.Errorf("proxy: could not create gzip reader: %w", err) + } + defer gzipReader.Close() + + buf := &bytes.Buffer{} + + //nolint:gosec + if _, err := io.Copy(buf, gzipReader); err != nil { + return fmt.Errorf("proxy: could not read gzipped response body: %w", err) + } + + res.Body = io.NopCloser(buf) + res.Header.Del("Content-Encoding") + res.Header.Set("Content-Length", fmt.Sprint(buf.Len())) + res.ContentLength = int64(buf.Len()) + + return nil +} diff --git a/pkg/proxy/proxy.go b/pkg/proxy/proxy.go index 99c9283..9f41da4 100644 --- a/pkg/proxy/proxy.go +++ b/pkg/proxy/proxy.go @@ -114,6 +114,11 @@ func (p *Proxy) modifyRequest(r *http.Request) { func (p *Proxy) modifyResponse(res *http.Response) error { fn := nopResModifier + // TODO: Make decompressing gzip formatted response bodies a configurable project setting. + if err := gunzipResponseBody(res); err != nil { + return fmt.Errorf("proxy: failed to gunzip response body: %w", err) + } + for i := len(p.resModifiers) - 1; i >= 0; i-- { fn = p.resModifiers[i](fn) } diff --git a/pkg/reqlog/reqlog.go b/pkg/reqlog/reqlog.go index 65b7f2e..a348cb6 100644 --- a/pkg/reqlog/reqlog.go +++ b/pkg/reqlog/reqlog.go @@ -2,7 +2,6 @@ package reqlog import ( "bytes" - "compress/gzip" "context" "errors" "fmt" @@ -267,23 +266,6 @@ func (svc *service) BypassOutOfScopeRequests() bool { } func ParseHTTPResponse(res *http.Response) (ResponseLog, error) { - if res.Header.Get("Content-Encoding") == "gzip" { - gzipReader, err := gzip.NewReader(res.Body) - if err != nil { - return ResponseLog{}, fmt.Errorf("reqlog: could not create gzip reader: %w", err) - } - defer gzipReader.Close() - - buf := &bytes.Buffer{} - - //nolint:gosec - if _, err := io.Copy(buf, gzipReader); err != nil { - return ResponseLog{}, fmt.Errorf("reqlog: could not read gzipped response body: %w", err) - } - - res.Body = io.NopCloser(buf) - } - body, err := io.ReadAll(res.Body) if err != nil { return ResponseLog{}, fmt.Errorf("reqlog: could not read body: %w", err)