public HttpRequestMessage SigningNative() { _contentStream.Position = 0; CleanupHeaders(_httpRequest); var meta = new SigningMetadata(RegionEndpoint.USEast1, new AwsCredentials("accessKey", "secretKey"), DateTime.UtcNow, _httpClient.DefaultRequestHeaders, null); AwsRequestSigner.Sign(_httpRequest, _contentStream, meta); return(_httpRequest); }
public async ValueTask <HttpResponseMessage> SendAsync(DynamoDbContextConfig config, HttpContent httpContent, CancellationToken cancellationToken = default) { try { int internalServerErrorRetries = 0, limitExceededRetries = 0, provisionedThroughputExceededRetries = 0, requestLimitExceededRetries = 0, serviceUnavailableRetries = 0, throttlingRetries = 0; while (true) { TimeSpan delay; try { using var request = new HttpRequestMessage(HttpMethod.Post, config.RegionEndpoint.RequestUri) { Content = httpContent }; try { var httpClient = _httpClientFactory.CreateHttpClient(); var stream = await httpContent.ReadAsStreamAsync().ConfigureAwait(false); var credentials = await config.CredentialsProvider.GetCredentialsAsync(cancellationToken).ConfigureAwait(false); var metadata = new SigningMetadata(config.RegionEndpoint, credentials, DateTime.UtcNow, httpClient.DefaultRequestHeaders, httpClient.BaseAddress); AwsRequestSigner.Sign(request, (RecyclableMemoryStream)stream, in metadata); var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); if (!response.IsSuccessStatusCode) { await ErrorHandler.ProcessErrorAsync(config.Metadata, response, cancellationToken).ConfigureAwait(false); } return(response); } finally { request.Content = null; } } catch (InternalServerErrorException) { if (!config.RetryStrategies.InternalServerErrorStrategy.TryGetRetryDelay(internalServerErrorRetries++, out delay)) { throw; } } catch (LimitExceededException) { if (!config.RetryStrategies.LimitExceededStrategy.TryGetRetryDelay(limitExceededRetries++, out delay)) { throw; } } catch (ProvisionedThroughputExceededException) { if (!config.RetryStrategies.ProvisionedThroughputExceededStrategy.TryGetRetryDelay(provisionedThroughputExceededRetries++, out delay)) { throw; } } catch (RequestLimitExceededException) { if (!config.RetryStrategies.RequestLimitExceededStrategy.TryGetRetryDelay(requestLimitExceededRetries++, out delay)) { throw; } } catch (ServiceUnavailableException) { if (!config.RetryStrategies.ServiceUnavailableStrategy.TryGetRetryDelay(serviceUnavailableRetries++, out delay)) { throw; } } catch (ThrottlingException) { if (!config.RetryStrategies.ThrottlingStrategy.TryGetRetryDelay(throttlingRetries++, out delay)) { throw; } } await Task.Delay(delay, cancellationToken).ConfigureAwait(false); } } finally { httpContent.Dispose(); } }