Create a torrentMap

This commit is contained in:
Ben Sarmiento
2023-11-08 20:20:52 +01:00
parent 17cd7ae1f4
commit 9dfd6c32d5
16 changed files with 405 additions and 324 deletions

51
pkg/http/client.go Normal file
View File

@@ -0,0 +1,51 @@
package http
import (
"net/http"
"time"
)
type HTTPClient struct {
Client *http.Client
MaxRetries int
Backoff func(attempt int) time.Duration
CheckRespStatus func(resp *http.Response, err error) bool
BearerToken string
}
func (r *HTTPClient) Do(req *http.Request) (*http.Response, error) {
if r.BearerToken != "" {
req.Header.Set("Authorization", "Bearer "+r.BearerToken)
}
var resp *http.Response
var err error
for attempt := 0; attempt < r.MaxRetries; attempt++ {
resp, err = r.Client.Do(req)
if !r.CheckRespStatus(resp, err) {
return resp, err
}
time.Sleep(r.Backoff(attempt))
}
return resp, err
}
func NewHTTPClient(token string, maxRetries int, timeout time.Duration) *HTTPClient {
return &HTTPClient{
BearerToken: token,
Client: &http.Client{Timeout: timeout},
MaxRetries: maxRetries,
Backoff: func(attempt int) time.Duration {
return time.Duration(attempt) * time.Second
},
CheckRespStatus: func(resp *http.Response, err error) bool {
if err != nil {
return true
}
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
return true
}
// no need to retry because the status code is 2XX
return false
},
}
}