writeRateLimitResponse sends a 429 response with Retry-After and X-RateLimit-* headers.
(w http.ResponseWriter, cfg rateLimitConfig)
| 619 | |
| 620 | // writeRateLimitResponse sends a 429 response with Retry-After and X-RateLimit-* headers. |
| 621 | func writeRateLimitResponse(w http.ResponseWriter, cfg rateLimitConfig) { |
| 622 | // Calculate retry-after from the rate (seconds until one token is available) |
| 623 | retryAfter := int(math.Ceil(1.0 / float64(cfg.Rate))) |
| 624 | if retryAfter < 1 { |
| 625 | retryAfter = 1 |
| 626 | } |
| 627 | if retryAfter > 3600 { |
| 628 | retryAfter = 3600 |
| 629 | } |
| 630 | |
| 631 | // Calculate requests per minute for the limit header |
| 632 | limitPerMinute := int(math.Ceil(float64(cfg.Rate) * 60)) |
| 633 | |
| 634 | w.Header().Set("Retry-After", strconv.Itoa(retryAfter)) |
| 635 | w.Header().Set("X-RateLimit-Limit", strconv.Itoa(limitPerMinute)) |
| 636 | w.Header().Set("X-RateLimit-Remaining", "0") |
| 637 | writeError(w, http.StatusTooManyRequests, "rate_limited", "Too many requests. Please try again later.") |
| 638 | } |
no test coverage detected