Ejemplo n.º 1
0
 public static Task <T> GetAsync <T>(
     string baseUri,
     string requestUri,
     Func <string, T> responseHandler,
     RequestLimitChecker requestLimitChecker = null,
     int maxAttempts = 0,
     CancellationToken cancellationToken = default(CancellationToken))
 {
     return(SendRequestAsync(
                baseUri: baseUri,
                requestUri: requestUri,
                method: HttpMethod.Get,
                content: null,
                responseHandler: responseHandler,
                requestLimitChecker: requestLimitChecker,
                maxAttempts: maxAttempts,
                cancellationToken: cancellationToken));
 }
Ejemplo n.º 2
0
        private static async Task <T> SendRequestAsync <T>(
            string baseUri,
            string requestUri,
            HttpMethod method,
            HttpContent content,
            Func <string, T> responseHandler,
            RequestLimitChecker requestLimitChecker = null,
            int maxAttempts = 0,
            CancellationToken cancellationToken = default(CancellationToken))
        {
            var tryToSend = true;
            var attempts  = 0;

            while (tryToSend)
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    cancellationToken.ThrowIfCancellationRequested();
                }

                if (requestLimitChecker != null)
                {
                    await requestLimitChecker.WaitIfNeeded(cancellationToken)
                    .ConfigureAwait(false);
                }

                Log.Debug("Send request: {@request}", requestUri);

                try
                {
                    attempts++;

                    using (var response = await SendRequest(baseUri, requestUri, method, content, cancellationToken)
                                          .ConfigureAwait(false))
                    {
                        if (response.IsSuccessStatusCode)
                        {
                            var responseContent = await response.Content
                                                  .ReadAsStringAsync()
                                                  .ConfigureAwait(false);

                            Log.Verbose($"Raw response content: {responseContent}");

                            return(responseHandler(responseContent));
                        }
                        else if ((int)response.StatusCode == HttpTooManyRequests)
                        {
                            Log.Debug("Too many requests");

                            for (var i = 0; i < TooManyRequestsDelayMs / MaxDelayMs; ++i)
                            {
                                await Task.Delay(MaxDelayMs, cancellationToken)
                                .ConfigureAwait(false);
                            }

                            continue;
                        }
                        else
                        {
                            var responseText = await response.Content
                                               .ReadAsStringAsync()
                                               .ConfigureAwait(false);

                            Log.Error("Invalid response: {@code} {@text}", response.StatusCode, responseText);
                        }
                    }
                }
                catch (Exception e)
                {
                    Log.Error(e, "Http request error");

                    if (attempts < maxAttempts)
                    {
                        continue;
                    }
                }

                tryToSend = false;
            }

            return(default(T));
        }