fix(client): validate Retry-After header (cap, fallback, edge cases)

- Ajoute try/except autour du float() pour gérer les dates HTTP RFC 7231
- Cap à 30s pour éviter un blocage indéfini sur valeur énorme
- Plancher à _RETRY_DELAY pour Retry-After: 0 ou négatif (FINDING-R2)
- 4 nouveaux tests : date HTTP, valeur zéro, valeur énorme, health check partiel

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
sylvain
2026-03-12 19:44:39 +01:00
parent 15ed533d20
commit 16344bbb3f
3 changed files with 73 additions and 1 deletions

View File

@@ -59,7 +59,17 @@ class GiteaClient:
if attempt < self._MAX_RETRIES:
retry_after = resp.headers.get("Retry-After")
if retry_after is not None:
delay = float(retry_after)
try:
# Cap a 30s pour eviter un blocage indefini.
# max() assure un plancher au backoff lineaire
# (protege contre Retry-After: 0 ou negatif).
delay = min(float(retry_after), 30.0)
delay = max(delay, self._RETRY_DELAY)
except (ValueError, TypeError):
# Retry-After peut etre une date HTTP RFC 7231
# (ex: "Wed, 21 Oct 2025 07:28:00 GMT") :
# on retombe sur le backoff lineaire standard.
delay = self._RETRY_DELAY * (attempt + 1)
else:
delay = self._RETRY_DELAY * (attempt + 1)
time.sleep(delay)