@@ -422,13 +422,15 @@ func copyResponseHeaders(w http.ResponseWriter, resp *http.Response) {
422422}
423423
424424// injectRetryAfterIfRateLimited inspects the upstream response for rate-limit signals
425- // (HTTP 429 or X-RateLimit -Remaining == 0). When detected it:
425+ // (HTTP 429 or X-Ratelimit -Remaining == 0). When detected it:
426426// 1. Injects a Retry-After header so the client knows when to retry.
427427// 2. Logs the event at ERROR level so operators can monitor rate-limit incidents.
428428func injectRetryAfterIfRateLimited (w http.ResponseWriter , resp * http.Response ) {
429429 is429 := resp .StatusCode == http .StatusTooManyRequests
430- remaining := resp .Header .Get ("X-RateLimit-Remaining" )
431- resetHeader := resp .Header .Get ("X-RateLimit-Reset" )
430+ // Use Go's canonical header key form (textproto.CanonicalMIMEHeaderKey produces
431+ // "X-Ratelimit-Remaining", matching GitHub's actual response headers).
432+ remaining := resp .Header .Get ("X-Ratelimit-Remaining" )
433+ resetHeader := resp .Header .Get ("X-Ratelimit-Reset" )
432434
433435 isRateLimited := is429 || remaining == "0"
434436 if ! isRateLimited {
@@ -441,7 +443,7 @@ func injectRetryAfterIfRateLimited(w http.ResponseWriter, resp *http.Response) {
441443 w .Header ().Set ("Retry-After" , strconv .Itoa (retryAfter ))
442444
443445 logger .LogError ("client" ,
444- "upstream rate limit hit: status=%d X-RateLimit -Remaining=%s X-RateLimit -Reset=%s retry-after=%ds" ,
446+ "upstream rate limit hit: status=%d X-Ratelimit -Remaining=%s X-Ratelimit -Reset=%s retry-after=%ds" ,
445447 resp .StatusCode , remaining , resetHeader , retryAfter )
446448}
447449
0 commit comments