From 537f7a8e9a1a04f0068c8f5e87039329b7e00ca3 Mon Sep 17 00:00:00 2001 From: Gilles Chehade Date: Wed, 10 May 2023 15:30:46 +0200 Subject: [PATCH 1/2] reset body cursor on request copy as it breaks transmission --- httpsig.go | 1 + 1 file changed, 1 insertion(+) diff --git a/httpsig.go b/httpsig.go index 7cb53ec..34c50ef 100644 --- a/httpsig.go +++ b/httpsig.go @@ -69,6 +69,7 @@ func NewSignTransport(transport http.RoundTripper, opts ...signOption) http.Roun if n != 0 { r.Body = io.NopCloser(bytes.NewReader(b.Bytes())) + nr.Body = io.NopCloser(bytes.NewReader(b.Bytes())) } } From 5bade48df18e5121e1d0deefeb23a25472d66464 Mon Sep 17 00:00:00 2001 From: Gilles Chehade Date: Tue, 26 Sep 2023 16:52:55 +0200 Subject: [PATCH 2/2] do not clone body, it's unnecessary and causes issues when the clone copies the cursor pointer --- httpsig.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/httpsig.go b/httpsig.go index 34c50ef..331e90d 100644 --- a/httpsig.go +++ b/httpsig.go @@ -56,8 +56,6 @@ func NewSignTransport(transport http.RoundTripper, opts ...signOption) http.Roun } return rt(func(r *http.Request) (*http.Response, error) { - nr := r.Clone(r.Context()) - b := &bytes.Buffer{} if r.Body != nil { n, err := b.ReadFrom(r.Body) @@ -69,25 +67,24 @@ func NewSignTransport(transport http.RoundTripper, opts ...signOption) http.Roun if n != 0 { r.Body = io.NopCloser(bytes.NewReader(b.Bytes())) - nr.Body = io.NopCloser(bytes.NewReader(b.Bytes())) } } // Always set a digest (for now) // TODO: we could skip setting digest on an empty body if content-length is included in the sig - nr.Header.Set("Digest", calcDigest(b.Bytes())) + r.Header.Set("Digest", calcDigest(b.Bytes())) - msg := messageFromRequest(nr) + msg := messageFromRequest(r) hdr, err := s.Sign(msg) if err != nil { return nil, err } for k, v := range hdr { - nr.Header[k] = v + r.Header[k] = v } - return transport.RoundTrip(nr) + return transport.RoundTrip(r) }) }