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, }); } }
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)); } }