Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/workos/_base_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

import asyncio
import json
import math
import os
import platform
import time
Expand Down Expand Up @@ -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:
Expand Down
44 changes: 44 additions & 0 deletions tests/test_nonfinite_retry_after.py
Original file line number Diff line number Diff line change
@@ -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
Loading