ParseRetryAfter extracts the cooldown duration from response headers. It prefers the OpenAI-specific "retry-after-ms" header (milliseconds) over the standard "Retry-After" header (seconds). Returns zero if neither header is present or parseable. The HTTP-date form of "Retry-After" is not parsed.
(resp *http.Response)
| 13 | // (seconds). Returns zero if neither header is present or |
| 14 | // parseable. The HTTP-date form of "Retry-After" is not parsed. |
| 15 | func ParseRetryAfter(resp *http.Response) time.Duration { |
| 16 | if resp == nil { |
| 17 | return 0 |
| 18 | } |
| 19 | |
| 20 | // OpenAI convention: millisecond precision. |
| 21 | if val := resp.Header.Get("retry-after-ms"); val != "" { |
| 22 | ms, err := strconv.ParseFloat(strings.TrimSpace(val), 64) |
| 23 | if err == nil && ms > 0 { |
| 24 | return time.Duration(ms * float64(time.Millisecond)) |
| 25 | } |
| 26 | } |
| 27 | |
| 28 | // Standard header: seconds. |
| 29 | if val := resp.Header.Get("Retry-After"); val != "" { |
| 30 | seconds, err := strconv.Atoi(strings.TrimSpace(val)) |
| 31 | if err == nil && seconds > 0 { |
| 32 | return time.Duration(seconds) * time.Second |
| 33 | } |
| 34 | } |
| 35 | |
| 36 | return 0 |
| 37 | } |