Esempio n. 1
0
 public UpdateItemSaveHttpContent(DynamoDbContextConfig config, TEntity entity)
     : base("DynamoDB_20120810.UpdateItem")
 {
     _config    = config;
     _entity    = entity;
     _classInfo = _config.Metadata.GetOrAddClassInfo <TEntity>();
 }
Esempio n. 2
0
        public async ValueTask <TResponse> SendAsync <TResponse>(DynamoDbContextConfig config, HttpContent httpContent, CancellationToken cancellationToken = default)
        {
            using var response = await SendAsync(config, httpContent, cancellationToken).ConfigureAwait(false);

            await using var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false);

            return((await JsonSerializer.DeserializeAsync <TResponse>(responseStream,
                                                                      new JsonSerializerOptions {
                Converters = { new DdbEnumJsonConverterFactory(), new UnixDateTimeJsonConverter() }
            }, cancellationToken).ConfigureAwait(false)) !);
        }
Esempio n. 3
0
 public DeleteEntityHighLevelHttpContent(DynamoDbContextConfig config, TEntity entity) : base("DynamoDB_20120810.DeleteItem")
 {
     _config = config;
     _entity = entity;
 }
Esempio n. 4
0
        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();
            }
        }