public static async Task <HttpResponseMessage> HttpRequestAndWaitRatelimit(HttpClient httpClient, HttpRequestMessage request, RateLimitCallbackDelegate rateLimitCallback = null, CancellationToken ct = default) { //request.Headers.Add("X-RateLimit-Precision", "millisecond"); while (true) { HttpResponseMessage response; try { request = await request.CloneAsync(); response = await httpClient.SendAsync(request, ct); } catch (HttpRequestException) { //Will try again on connection errors continue; } if (response.IsSuccessStatusCode) { return(response); } else if ((int)response.StatusCode == 429) { //int rateLimitResetTime = int.Parse(response.Headers.GetValues("X-RateLimit-Reset-After").First().Replace(".", "")); int rateLimitResetTime = int.Parse(response.Headers.GetValues("Retry-After").First()); rateLimitCallback?.Invoke(rateLimitResetTime); await Task.Delay(TimeSpan.FromSeconds(rateLimitResetTime), ct); } else { string excStr = "Unexpected response in HttpRequestAndWaitRatelimit: response.StatusCode is " + response.StatusCode; if (response.Headers.TryGetValues("X-RateLimit-Remaining", out IEnumerable <string> XRateLimitRemainingValues)) { excStr += " X-RateLimit-Remaining is " + XRateLimitRemainingValues.First(); } string body = null; if ((body = await response.Content.ReadAsStringAsync()) != null) { excStr += " response.Content is " + body; } throw new Exception(excStr); } } }
public static async Task <string> HttpGetStringAndWaitRatelimit(HttpClient httpClient, string uri, RateLimitCallbackDelegate rateLimitCallback = null, CancellationToken ct = default) { return(await HttpGetStringAndWaitRatelimit(httpClient, new Uri(uri), rateLimitCallback, ct)); }
public static async Task <string> HttpGetStringAndWaitRatelimit(HttpClient httpClient, Uri uri, RateLimitCallbackDelegate rateLimitCallback = null, CancellationToken ct = default) { return(await(await HttpRequestAndWaitRatelimit(httpClient, new HttpRequestMessage(HttpMethod.Get, uri), rateLimitCallback, ct)).Content.ReadAsStringAsync()); }