From 898b235a840b3e796cc35b094ca55847c2963b78 Mon Sep 17 00:00:00 2001 From: Toni Spets Date: Wed, 13 Mar 2024 08:49:13 +0200 Subject: [PATCH] Allow overriding http.Client with FullRequest --- client.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/client.go b/client.go index ad68e79..686c0e1 100644 --- a/client.go +++ b/client.go @@ -338,6 +338,7 @@ type FullRequest struct { SensitiveContent bool Handler ClientResponseHandler Logger *zerolog.Logger + Client *http.Client } var requestID int32 @@ -424,7 +425,10 @@ func (cli *Client) MakeFullRequest(ctx context.Context, params FullRequest) ([]b if len(cli.AccessToken) > 0 { req.Header.Set("Authorization", "Bearer "+cli.AccessToken) } - return cli.executeCompiledRequest(req, params.MaxAttempts-1, 4*time.Second, params.ResponseJSON, params.Handler) + if params.Client == nil { + params.Client = cli.Client + } + return cli.executeCompiledRequest(req, params.MaxAttempts-1, 4*time.Second, params.ResponseJSON, params.Handler, params.Client) } func (cli *Client) cliOrContextLog(ctx context.Context) *zerolog.Logger { @@ -435,7 +439,7 @@ func (cli *Client) cliOrContextLog(ctx context.Context) *zerolog.Logger { return log } -func (cli *Client) doRetry(req *http.Request, cause error, retries int, backoff time.Duration, responseJSON interface{}, handler ClientResponseHandler) ([]byte, error) { +func (cli *Client) doRetry(req *http.Request, cause error, retries int, backoff time.Duration, responseJSON interface{}, handler ClientResponseHandler, client *http.Client) ([]byte, error) { log := zerolog.Ctx(req.Context()) if req.Body != nil { if req.GetBody == nil { @@ -453,7 +457,7 @@ func (cli *Client) doRetry(req *http.Request, cause error, retries int, backoff Int("retry_in_seconds", int(backoff.Seconds())). Msg("Request failed, retrying") time.Sleep(backoff) - return cli.executeCompiledRequest(req, retries-1, backoff*2, responseJSON, handler) + return cli.executeCompiledRequest(req, retries-1, backoff*2, responseJSON, handler, client) } func readRequestBody(req *http.Request, res *http.Response) ([]byte, error) { @@ -535,17 +539,17 @@ func ParseErrorResponse(req *http.Request, res *http.Response) ([]byte, error) { } } -func (cli *Client) executeCompiledRequest(req *http.Request, retries int, backoff time.Duration, responseJSON interface{}, handler ClientResponseHandler) ([]byte, error) { +func (cli *Client) executeCompiledRequest(req *http.Request, retries int, backoff time.Duration, responseJSON interface{}, handler ClientResponseHandler, client *http.Client) ([]byte, error) { cli.RequestStart(req) startTime := time.Now() - res, err := cli.Client.Do(req) + res, err := client.Do(req) duration := time.Now().Sub(startTime) if res != nil { defer res.Body.Close() } if err != nil { if retries > 0 { - return cli.doRetry(req, err, retries, backoff, responseJSON, handler) + return cli.doRetry(req, err, retries, backoff, responseJSON, handler, client) } err = HTTPError{ Request: req, @@ -560,7 +564,7 @@ func (cli *Client) executeCompiledRequest(req *http.Request, retries int, backof if retries > 0 && retryafter.Should(res.StatusCode, !cli.IgnoreRateLimit) { backoff = retryafter.Parse(res.Header.Get("Retry-After"), backoff) - return cli.doRetry(req, fmt.Errorf("HTTP %d", res.StatusCode), retries, backoff, responseJSON, handler) + return cli.doRetry(req, fmt.Errorf("HTTP %d", res.StatusCode), retries, backoff, responseJSON, handler, client) } var body []byte