aboutsummaryrefslogtreecommitdiff
path: root/http.h
diff options
context:
space:
mode:
authorVaidas Pilkauskas <vaidas.pilkauskas@shopify.com>2026-03-17 13:00:35 +0000
committerJunio C Hamano <gitster@pobox.com>2026-03-17 09:14:19 -0700
commit640657ffd06999ec1ec3b1d030b7f5aac6b7f57b (patch)
tree2c64d3e66fb76d7125fc9552a9358880319ff906 /http.h
parenta4fddb01c5bd0ecbd5e297ee571ad29ca62bf940 (diff)
downloadgit-640657ffd06999ec1ec3b1d030b7f5aac6b7f57b.tar.xz
http: add support for HTTP 429 rate limit retries
Add retry logic for HTTP 429 (Too Many Requests) responses to handle server-side rate limiting gracefully. When Git's HTTP client receives a 429 response, it can now automatically retry the request after an appropriate delay, respecting the server's rate limits. The implementation supports the RFC-compliant Retry-After header in both delay-seconds (integer) and HTTP-date (RFC 2822) formats. If a past date is provided, Git retries immediately without waiting. Retry behavior is controlled by three new configuration options (http.maxRetries, http.retryAfter, and http.maxRetryTime) which are documented in git-config(1). The retry logic implements a fail-fast approach: if any delay (whether from server header or configuration) exceeds maxRetryTime, Git fails immediately with a clear error message rather than capping the delay. This provides better visibility into rate limiting issues. The implementation includes extensive test coverage for basic retry behavior, Retry-After header formats (integer and HTTP-date), configuration combinations, maxRetryTime limits, invalid header handling, environment variable overrides, and edge cases. Signed-off-by: Vaidas Pilkauskas <vaidas.pilkauskas@shopify.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'http.h')
-rw-r--r--http.h9
1 files changed, 9 insertions, 0 deletions
diff --git a/http.h b/http.h
index f9d4593404..f9ee888c3e 100644
--- a/http.h
+++ b/http.h
@@ -20,6 +20,7 @@ struct slot_results {
long http_code;
long auth_avail;
long http_connectcode;
+ long retry_after;
};
struct active_request_slot {
@@ -157,6 +158,13 @@ struct http_get_options {
* request has completed.
*/
struct string_list *extra_headers;
+
+ /*
+ * After a request completes, contains the Retry-After delay in seconds
+ * if the server returned HTTP 429 with a Retry-After header (requires
+ * libcurl 7.66.0 or later), or -1 if no such header was present.
+ */
+ long retry_after;
};
/* Return values for http_get_*() */
@@ -167,6 +175,7 @@ struct http_get_options {
#define HTTP_REAUTH 4
#define HTTP_NOAUTH 5
#define HTTP_NOMATCHPUBLICKEY 6
+#define HTTP_RATE_LIMITED 7
/*
* Requests a URL and stores the result in a strbuf.