Esempio n. 1
0
        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);
                }
            }
        }
Esempio n. 2
0
 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));
 }
Esempio n. 3
0
 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());
 }