From c515918d42388f6d87765833d83b4a0035770a5e Mon Sep 17 00:00:00 2001 From: Shubham Padkonde Date: Fri, 2 Oct 2026 11:09:25 +0530 Subject: [PATCH] fix: fall back from nonfinite retry-after values --- src/workos/_base_client.py | 4 ++- tests/test_nonfinite_retry_after.py | 44 +++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 tests/test_nonfinite_retry_after.py diff --git a/src/workos/_base_client.py b/src/workos/_base_client.py index 7c6f7e64..383339cd 100644 --- a/src/workos/_base_client.py +++ b/src/workos/_base_client.py @@ -3,6 +3,7 @@ import asyncio import json +import math import os import platform import time @@ -136,7 +137,8 @@ def _parse_retry_after(retry_after: Optional[str]) -> Optional[float]: if not value: return None try: - return max(float(value), 0.0) + seconds = float(value) + return max(seconds, 0.0) if math.isfinite(seconds) else None except ValueError: pass try: diff --git a/tests/test_nonfinite_retry_after.py b/tests/test_nonfinite_retry_after.py new file mode 100644 index 00000000..40c60eff --- /dev/null +++ b/tests/test_nonfinite_retry_after.py @@ -0,0 +1,44 @@ +# @oagen-ignore-file + +import math + +import pytest + +from workos import _base_client + + +@pytest.mark.parametrize("retry_after", ["NaN", "Infinity", "1e309"]) +def test_nonfinite_retry_after_uses_backoff( + workos, httpx_mock, monkeypatch, retry_after +): + delays = [] + + def sleep(delay): + assert math.isfinite(delay) + delays.append(delay) + + monkeypatch.setattr(_base_client.time, "sleep", sleep) + httpx_mock.add_response(status_code=503, headers={"Retry-After": retry_after}) + httpx_mock.add_response(json={"ok": True}) + assert workos.request("GET", ("test",)) == {"ok": True} + assert len(delays) == 1 + assert 0.5 <= delays[0] <= 1.5 + + +@pytest.mark.asyncio +@pytest.mark.parametrize("retry_after", ["NaN", "Infinity", "1e309"]) +async def test_async_nonfinite_retry_after_uses_backoff( + async_workos, httpx_mock, monkeypatch, retry_after +): + delays = [] + + async def sleep(delay): + assert math.isfinite(delay) + delays.append(delay) + + monkeypatch.setattr(_base_client.asyncio, "sleep", sleep) + httpx_mock.add_response(status_code=503, headers={"Retry-After": retry_after}) + httpx_mock.add_response(json={"ok": True}) + assert await async_workos.request("GET", ("test",)) == {"ok": True} + assert len(delays) == 1 + assert 0.5 <= delays[0] <= 1.5