Skip to content

fix: fall back from nonfinite Retry-After values - #742

Merged
gjtorikian merged 3 commits into
workos:mainfrom
Shubham-Padkonde:fix/finite-retry-after
Oct 15, 2026
Merged

gjtorikian merged 3 commits into
workos:mainfrom
Shubham-Padkonde:fix/finite-retry-after

Conversation

@Shubham-Padkonde

Copy link
Copy Markdown
Contributor

Description

A malformed Retry-After header such as NaN, Infinity, or an overflowing numeric value currently reaches time.sleep/asyncio.sleep. This can replace the API error with a ValueError/OverflowError or leave an asynchronous retry waiting indefinitely.

Treat nonfinite numeric values as invalid headers and use the existing exponential backoff, just as for other unparseable Retry-After values. Valid numeric values and HTTP dates retain their behavior.

Six sync/async response regressions fail before the fix and pass afterward. The complete suite passes: 2,887 tests. Ruff and git diff --check pass.

Documentation

No public API or documentation changes required.

@greptile-apps

greptile-apps Bot commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 5/5

[High impact] The PR appears safe to merge; no outstanding finding or new issue was identified.

Summary

The PR rejects nonfinite and non-integer Retry-After values, caps valid retry sleeps, and adds sync and async regression tests. The changes since the previous review tighten those tests to distinguish fallback from capped delays.

Reviews (3) · Last reviewed commit: "test: pin fallback sleep range for malfo..." · Reviewed by Greptile

Rejecting only NaN/inf left the same failure one header away: a finite
but huge Retry-After (e.g. 99999999999, or an HTTP-date centuries out)
still overflows time.sleep and leaves asyncio.sleep waiting forever.

Parse delay-seconds as RFC 9110 1*DIGIT so exponent notation, NaN and
Infinity are rejected as syntax, and cap the sleep at MAX_RETRY_AFTER
(60s, matching workos-node). The cap lives in _calculate_retry_delay so
RateLimitExceededError.retry_after still reports the raw server value.

Tests move next to the existing Retry-After tests in
tests/test_generated_client.py and gain direct parser assertions.
Comment thread tests/test_generated_client.py Outdated
The bounded-sleep tests accepted any delay up to MAX_RETRY_AFTER for
NaN/Infinity/1e309, so a regression that capped instead of falling back
to backoff would have passed. Pair each value with the range the client
must use: first backoff step for malformed input, the cap for huge
finite values.
@gjtorikian

Copy link
Copy Markdown
Contributor

thanks!

@gjtorikian
gjtorikian merged commit a65c626 into workos:main Oct 15, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants