コード例 #1
0
        private async Task <HttpResponse <string> > SendAsync(
            HttpRequestMessage request,
            CancellationToken cancellationToken)
        {
            _logger.LogTrace($"{request.Method} {request.RequestUri}");

            Func <HttpRequestMessage, CancellationToken, Task <HttpResponseMessage> > operation = async(x, y) => await _httpClient.SendAsync(x, y).ConfigureAwait(false);

            using (var response = await _retryStrategy.WaitAndRetryAsync(request, cancellationToken, operation).ConfigureAwait(false))
            {
                _logger.LogTrace($"{(int)response.StatusCode} {request.RequestUri.PathAndQuery}");

                string stringContent = null;
                if (response.Content != null)
                {
                    stringContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
                }

                return(new HttpResponse <string>
                {
                    Headers = ExtractHeaders(response),
                    StatusCode = (int)response.StatusCode,
                    Payload = stringContent,
                });
            }
        }
コード例 #2
0
        private async Task <HttpResponse <string> > SendAsync(
            HttpRequestMessage request,
            CancellationToken cancellationToken)
        {
            _logger.LogTrace($"{request.Method} {request.RequestUri}");

            if (_oktaConfiguration.AuthorizationMode == AuthorizationMode.PrivateKey)
            {
                await ApplyOAuthHeaderAsync().ConfigureAwait(false);
            }

            Func <HttpRequestMessage, CancellationToken, Task <HttpResponseMessage> > operation = async(x, y) => await _httpClient.SendAsync(x, y).ConfigureAwait(false);

            HttpResponseMessage response = null;

            using (response = await _retryStrategy.WaitAndRetryAsync(request, cancellationToken, operation).ConfigureAwait(false))
            {
                _logger.LogTrace($"{(int)response.StatusCode} {request.RequestUri.PathAndQuery}");

                // If OAuth token expired, get a new token and retry
                if ((int)response.StatusCode == 401 && _oktaConfiguration.AuthorizationMode == AuthorizationMode.PrivateKey)
                {
                    await ApplyOAuthHeaderAsync(true).ConfigureAwait(false);

                    // Sending same request twice cause failures
                    var clonedRequest = await HttpRequestMessageHelper.CloneHttpRequestMessageAsync(request).ConfigureAwait(false);

                    using (response = await _retryStrategy.WaitAndRetryAsync(clonedRequest, cancellationToken, operation).ConfigureAwait(false))
                    {
                        return(await ProcessResponseAsync(response).ConfigureAwait(false));
                    }
                }

                var delay = GetMillisToWaitForRateLimitReset(response);

                if (delay.HasValue)
                {
                    _logger.LogDebug($"delaying execution for: {delay.Value * 1000}ms");

                    await Task.Delay(delay.Value * 1000, cancellationToken).ConfigureAwait(false);
                }

                return(await ProcessResponseAsync(response).ConfigureAwait(false));
            }
        }