From bac6351071233310576d7a000951bb928ef231ab Mon Sep 17 00:00:00 2001 From: Ben Adrian Sarmiento Date: Mon, 26 Aug 2024 20:19:12 +0200 Subject: [PATCH] Retry on download requests --- pkg/http/client.go | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/pkg/http/client.go b/pkg/http/client.go index d4b3859..9656710 100644 --- a/pkg/http/client.go +++ b/pkg/http/client.go @@ -263,6 +263,23 @@ func (r *HTTPClient) shouldRetry(req *http.Request, resp *http.Response, err err return false } + // retry on timeout errors for download requests + if err != nil && strings.Contains(err.Error(), "timeout") && strings.Contains(req.Host, ".download.real-debrid.") { + oldHost := req.Host + // remove old host from the list of reachable hosts + for i, host := range r.hosts { + if host == oldHost { + r.hosts = append(r.hosts[:i], r.hosts[i+1:]...) + break + } + } + // pick a new host from the list + req.Host = r.hosts[rand.Intn(len(r.hosts))] + req.URL.Host = req.Host + r.log.Debugf("Download timed out, attempt #%d, retrying with a new host (%s -> %s)", attempts+1, oldHost, req.URL.Host) + return true + } + if apiErr, ok := err.(*ApiErrorResponse); ok { switch apiErr.Code { case 5: // Slow down (retry infinitely) @@ -314,7 +331,7 @@ func (r *HTTPClient) shouldRetry(req *http.Request, resp *http.Response, err err } if attempts >= r.maxRetries { - r.log.Debugf("Request failed, attempt #%d (error=%v)", attempts+1, err) + r.log.Errorf("Request failed, attempt #%d (error=%v), giving up", attempts+1, err) return false } secs := r.backoff(attempts, 1)