From d61d5c8a6ad045fe7779fe8d0efe2fd06f691fba Mon Sep 17 00:00:00 2001 From: kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com> Date: Tue, 2 Apr 2024 12:12:26 +0100 Subject: [bugfix] httpclient not signing subsequent redirect requests (#2798) * move http request signing to transport * actually hook up the http roundtripper ... * add code comments for the new gtscontext functions --- internal/httpclient/sign.go | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) (limited to 'internal/httpclient/sign.go') diff --git a/internal/httpclient/sign.go b/internal/httpclient/sign.go index 78046aa28..8e66d1bda 100644 --- a/internal/httpclient/sign.go +++ b/internal/httpclient/sign.go @@ -17,12 +17,45 @@ package httpclient -import "net/http" +import ( + "net/http" + "time" + + "codeberg.org/gruf/go-byteutil" + "github.com/superseriousbusiness/gotosocial/internal/gtscontext" +) // SignFunc is a function signature that provides request signing. type SignFunc func(r *http.Request) error -type SigningClient interface { - Do(r *http.Request) (*http.Response, error) - DoSigned(r *http.Request, sign SignFunc) (*http.Response, error) +// signingtransport wraps an http.Transport{} +// (RoundTripper implementer) to check request +// context for a signing function and using for +// all subsequent trips through RoundTrip(). +type signingtransport struct { + http.Transport // underlying transport +} + +func (t *signingtransport) RoundTrip(r *http.Request) (*http.Response, error) { + if sign := gtscontext.HTTPClientSignFunc(r.Context()); sign != nil { + // Reset signing header fields + now := time.Now().UTC() + r.Header.Set("Date", now.Format("Mon, 02 Jan 2006 15:04:05")+" GMT") + r.Header.Del("Signature") + r.Header.Del("Digest") + + // Rewind body reader and content-length if set. + if rc, ok := r.Body.(*byteutil.ReadNopCloser); ok { + rc.Rewind() // set len AFTER rewind + r.ContentLength = int64(rc.Len()) + } + + // Sign the outgoing request. + if err := sign(r); err != nil { + return nil, err + } + } + + // Pass to underlying transport. + return t.Transport.RoundTrip(r) } -- cgit v1.2.3