feat(gitea): add retry logic for 5xx errors #69
+7
-5
@@ -374,19 +374,21 @@ func (c *Client) doGet(ctx context.Context, reqURL string) ([]byte, error) {
|
|||||||
|
|
||||||
resp, err := c.http.Do(req)
|
resp, err := c.http.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Check if this is a temporary/transient network error worth retrying.
|
// Always capture the error for consistent return at loop end.
|
||||||
// We only retry if there are attempts remaining.
|
// This ensures both network errors and HTTP 5xx return lastErr.
|
||||||
|
lastErr = err
|
||||||
|
|
||||||
|
// Only retry temporary network errors when attempts remain.
|
||||||
if attempt < maxAttempts-1 && isTemporaryNetError(err) {
|
if attempt < maxAttempts-1 && isTemporaryNetError(err) {
|
||||||
slog.Warn("temporary network error, will retry",
|
slog.Warn("temporary network error, will retry",
|
||||||
"attempt", attempt+1,
|
"attempt", attempt+1,
|
||||||
"url", redactURL(reqURL),
|
"url", redactURL(reqURL),
|
||||||
"error", err)
|
"error", err)
|
||||||
lastErr = err
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
return nil, err
|
// Non-retryable network error or final attempt exhausted.
|
||||||
|
return nil, lastErr
|
||||||
}
|
}
|
||||||
|
|
||||||
if resp.StatusCode >= 200 && resp.StatusCode < 300 {
|
if resp.StatusCode >= 200 && resp.StatusCode < 300 {
|
||||||
body, err := io.ReadAll(resp.Body)
|
body, err := io.ReadAll(resp.Body)
|
||||||
resp.Body.Close()
|
resp.Body.Close()
|
||||||
|
|||||||
Reference in New Issue
Block a user