refactor: http retry for retryable errors (#20)

This commit is contained in:
l3uddz
2021-02-21 14:01:21 +00:00
committed by GitHub
parent a2848439b9
commit db9fdc97a2
21 changed files with 150 additions and 115 deletions

View File

@@ -28,13 +28,8 @@ func (c *Client) GetItem(imdbId string) (*Item, error) {
return nil, fmt.Errorf("generate lookup request url: %w", err)
}
c.log.Trace().
Str("url", reqUrl).
Msg("Searching omdb")
// send request
c.rl.Take()
resp, err := rek.Get(reqUrl, rek.Timeout(c.apiTimeout))
resp, err := rek.Get(reqUrl, rek.Client(c.http))
if err != nil {
return nil, fmt.Errorf("request lookup: %w", err)
}

View File

@@ -2,27 +2,31 @@ package omdb
import (
"github.com/l3uddz/nabarr/logger"
"github.com/l3uddz/nabarr/util"
"github.com/rs/zerolog"
"go.uber.org/ratelimit"
"net/http"
"time"
)
type Client struct {
apiKey string
log zerolog.Logger
rl ratelimit.Limiter
log zerolog.Logger
http *http.Client
apiURL string
apiTimeout time.Duration
apiKey string
apiURL string
}
func New(cfg *Config) *Client {
return &Client{
apiKey: cfg.ApiKey,
log: logger.New(cfg.Verbosity).With().Logger(),
rl: ratelimit.New(1, ratelimit.WithoutSlack),
l := logger.New(cfg.Verbosity).With().
Str("media", "omdb").
Logger()
apiURL: "https://www.omdbapi.com",
apiTimeout: 30 * time.Second,
return &Client{
log: l,
http: util.NewRetryableHttpClient(30*time.Second, ratelimit.New(1, ratelimit.WithoutSlack), &l),
apiKey: cfg.ApiKey,
apiURL: "https://www.omdbapi.com",
}
}

View File

@@ -23,13 +23,8 @@ func (c *Client) GetShow(tvdbId string) (*Show, error) {
return nil, fmt.Errorf("generate lookup show request url: %w", err)
}
c.log.Trace().
Str("url", reqUrl).
Msg("Searching trakt")
// send request
c.rl.Take()
resp, err := rek.Get(reqUrl, rek.Headers(c.getAuthHeaders()), rek.Timeout(c.apiTimeout))
resp, err := rek.Get(reqUrl, rek.Client(c.http), rek.Headers(c.getAuthHeaders()))
if err != nil {
return nil, fmt.Errorf("request show: %w", err)
}
@@ -67,13 +62,8 @@ func (c *Client) GetMovie(imdbId string) (*Movie, error) {
return nil, fmt.Errorf("generate lookup movie request url: %w", err)
}
c.log.Trace().
Str("url", reqUrl).
Msg("Searching trakt")
// send request
c.rl.Take()
resp, err := rek.Get(reqUrl, rek.Headers(c.getAuthHeaders()), rek.Timeout(c.apiTimeout))
resp, err := rek.Get(reqUrl, rek.Client(c.http), rek.Headers(c.getAuthHeaders()))
if err != nil {
return nil, fmt.Errorf("request movie: %w", err)
}

View File

@@ -2,34 +2,38 @@ package trakt
import (
"github.com/l3uddz/nabarr/logger"
"github.com/l3uddz/nabarr/util"
"github.com/rs/zerolog"
"go.uber.org/ratelimit"
"net/http"
"time"
)
type Client struct {
clientId string
log zerolog.Logger
rl ratelimit.Limiter
log zerolog.Logger
http *http.Client
apiURL string
apiTimeout time.Duration
apiKey string
apiURL string
}
func New(cfg *Config) *Client {
return &Client{
clientId: cfg.ClientId,
log: logger.New(cfg.Verbosity).With().Logger(),
rl: ratelimit.New(1, ratelimit.WithoutSlack),
l := logger.New(cfg.Verbosity).With().
Str("media", "trakt").
Logger()
apiURL: "https://api.trakt.tv",
apiTimeout: 30 * time.Second,
return &Client{
log: l,
http: util.NewRetryableHttpClient(30*time.Second, ratelimit.New(1, ratelimit.WithoutSlack), &l),
apiKey: cfg.ClientId,
apiURL: "https://api.trakt.tv",
}
}
func (c *Client) getAuthHeaders() map[string]string {
return map[string]string{
"trakt-api-key": c.clientId,
"trakt-api-key": c.apiKey,
"trakt-api-version": "2",
}
}

View File

@@ -20,13 +20,9 @@ func (c *Client) GetItem(tvdbId string) (*Item, error) {
// prepare request
reqUrl := util.JoinURL(c.apiURL, "series", tvdbId)
c.log.Trace().
Str("url", reqUrl).
Msg("Searching tvdb")
// send request
c.rl.Take()
resp, err := rek.Get(reqUrl, rek.Headers(c.apiHeaders), rek.Timeout(c.apiTimeout))
resp, err := rek.Get(reqUrl, rek.Client(c.http), rek.Headers(c.apiHeaders))
if err != nil {
return nil, fmt.Errorf("request lookup: %w", err)
}

View File

@@ -3,31 +3,35 @@ package tvdb
import (
"fmt"
"github.com/l3uddz/nabarr/logger"
"github.com/l3uddz/nabarr/util"
"github.com/rs/zerolog"
"go.uber.org/ratelimit"
"net/http"
"time"
)
type Client struct {
apiKey string
log zerolog.Logger
rl ratelimit.Limiter
log zerolog.Logger
http *http.Client
apiKey string
apiURL string
apiHeaders map[string]string
apiTimeout time.Duration
}
func New(cfg *Config) *Client {
return &Client{
apiKey: cfg.ApiKey,
log: logger.New(cfg.Verbosity).With().Logger(),
rl: ratelimit.New(1, ratelimit.WithoutSlack),
l := logger.New(cfg.Verbosity).With().
Str("media", "tvdb").
Logger()
return &Client{
log: l,
http: util.NewRetryableHttpClient(30*time.Second, ratelimit.New(1, ratelimit.WithoutSlack), &l),
apiKey: cfg.ApiKey,
apiURL: "https://api.thetvdb.com",
apiHeaders: map[string]string{
"Authorization": fmt.Sprintf("Bearer %s", cfg.ApiKey),
},
apiTimeout: 30 * time.Second,
}
}