47 lines
1.1 KiB
Go
47 lines
1.1 KiB
Go
package util
|
|
|
|
import (
|
|
"github.com/hashicorp/go-retryablehttp"
|
|
"github.com/l3uddz/nabarr/build"
|
|
"github.com/rs/zerolog"
|
|
"go.uber.org/ratelimit"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
func NewRetryableHttpClient(timeout time.Duration, rl ratelimit.Limiter, log *zerolog.Logger) *http.Client {
|
|
retryClient := retryablehttp.NewClient()
|
|
retryClient.RetryMax = 10
|
|
retryClient.RetryWaitMin = 1 * time.Second
|
|
retryClient.RetryWaitMax = 10 * time.Second
|
|
retryClient.RequestLogHook = func(l retryablehttp.Logger, request *http.Request, i int) {
|
|
// set user-agent
|
|
request.Header.Set("User-Agent", "nabarr/"+build.Version)
|
|
|
|
// rate limit
|
|
if rl != nil {
|
|
rl.Take()
|
|
}
|
|
|
|
// log
|
|
if log != nil && request != nil && request.URL != nil {
|
|
switch i {
|
|
case 0:
|
|
// first
|
|
log.Trace().
|
|
Str("url", request.URL.String()).
|
|
Msg("Sending request")
|
|
default:
|
|
// retry
|
|
log.Debug().
|
|
Str("url", request.URL.String()).
|
|
Int("attempt", i).
|
|
Msg("Retrying failed request")
|
|
}
|
|
}
|
|
}
|
|
retryClient.HTTPClient.Timeout = timeout
|
|
retryClient.Logger = nil
|
|
return retryClient.StandardClient()
|
|
}
|