da77b123ec
A gateway that answers 429 with Retry-After: inf (or 1e999, which float() happily rounds to inf) used to reach backoff_delay as retry_after_s=inf. max(delay, retry_after) then picked it, and since the library deliberately does not clamp the hint with backoff_max_s, the attempt slept forever. - _parse_retry_after now rejects non-finite values via math.isinf and returns None, so the call falls back to plain exponential backoff - it emits exactly one warning carrying the source name and the verdict word retry_after_not_finite, never the raw header: under a 429 storm an echoed header drowns the real signal and does not help localisation - source_name becomes a required keyword-only argument; the function is private, so no default is given and a missed call site fails loudly instead of silently dropping the source identity from the warning - nan keeps flowing through the existing seconds > 0 semantics; no new branch, no reordering of the parse