/// <summary> /// Check if GitHub has applied rate limiting to our call /// </summary> /// <param name="headers">Headers returned alongside API call</param> /// <param name="log">Cake log</param> /// <returns>True - We have been rate limited</returns> public static bool HasGitHubRateLimitedUs(this HttpHeaders headers, IRetrieverLog log) { var result = false; IEnumerable <string> rateLimit; IEnumerable <string> remainingRate; if (headers.TryGetValues("X-RateLimit-Limit", out rateLimit) && headers.TryGetValues("X-RateLimit-Remaining", out remainingRate)) { var limit = int.Parse(rateLimit.FirstOrDefault() ?? "0"); var remaining = int.Parse(remainingRate.FirstOrDefault() ?? "0"); log.Information($"GitHub API Rate Limit: {limit} per hour"); if (remaining <= 0) { log.Warning("GitHub API has been rate limited\r\n" + "- If you haven't done so already please provide a token to up your limit"); result = true; } else { log.Information($"GitHub API Remaining before limit: {remaining}"); } } else { log.Warning("There were no Rate Limit headers"); result = true; } return(result); }
/// <summary> /// Constructor used to pass in a <see cref="IRetrieverLog"/> instance. /// This allows logging of progress and errors /// </summary> /// <param name="gitHubApiUrlHelper">Class implementing <see cref="IGitHubApiUrlHelper"/></param> /// <param name="log">Instance of a class implementing <see cref="IRetrieverLog"/></param> /// <param name="oAuthToken">GitHub OAuth token - Pass an empty string if not used</param> public GitHubReleaseRetriever(IGitHubApiUrlHelper gitHubApiUrlHelper, IRetrieverLog log, string oAuthToken) : this(gitHubApiUrlHelper, oAuthToken) { _log = log; }