aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJörg Thalheim <joerg@thalheim.io>2022-09-12 22:50:18 +0200
committerJörg Thalheim <joerg@thalheim.io>2022-10-01 10:38:09 +0200
commitd9abce4ad4b6888183271c0a4051981dee5fffe3 (patch)
treee080dbde948ef1142e958cf69bfe8567683a8ee7
parent88646eea295a07e0d35ccbf8884f0956bc6f4248 (diff)
libfetchers: avoid api.github.com ratelimit if no github token is set
If we don't have any github token, we won't be able to fetch private repos, but we are also more likely to run into API limits since we don't have a token. To mitigate this only ever use the github api if we actually have a token.
-rw-r--r--src/libfetchers/github.cc19
1 files changed, 11 insertions, 8 deletions
diff --git a/src/libfetchers/github.cc b/src/libfetchers/github.cc
index a491d82a6..2115ce2f5 100644
--- a/src/libfetchers/github.cc
+++ b/src/libfetchers/github.cc
@@ -262,17 +262,20 @@ struct GitHubInputScheme : GitArchiveInputScheme
DownloadUrl getDownloadUrl(const Input & input) const override
{
- // FIXME: use regular /archive URLs instead? api.github.com
- // might have stricter rate limits.
auto host = maybeGetStrAttr(input.attrs, "host").value_or("github.com");
- auto url = fmt(
- host == "github.com"
- ? "https://api.%s/repos/%s/%s/tarball/%s"
- : "https://%s/api/v3/repos/%s/%s/tarball/%s",
- host, getStrAttr(input.attrs, "owner"), getStrAttr(input.attrs, "repo"),
+ Headers headers = makeHeadersWithAuthTokens(host);
+ // If we have no auth headers then we default to the public archive
+ // urls so we do not run into rate limits.
+ const auto urlFmt =
+ host != "github.com"
+ ? "https://%s/api/v3/repos/%s/%s/tarball/%s"
+ : headers.empty()
+ ? "https://%s/%s/%s/archive/%s.tar.gz"
+ : "https://api.%s/repos/%s/%s/tarball/%s";
+
+ const auto url = fmt(urlFmt, host, getStrAttr(input.attrs, "owner"), getStrAttr(input.attrs, "repo"),
input.getRev()->to_string(Base16, false));
- Headers headers = makeHeadersWithAuthTokens(host);
return DownloadUrl { url, headers };
}