Exemple #1
0
        /// <inheritdoc />
        public async Task Invoke(RequestMessage request, CancellationToken cancellationToken = default)
        {
            cancellationToken.ThrowIfCancellationRequested();
            Bucket?bucket = null;

            try
            {
                bucket = await bucketService.GetBucketAndWaitForAvailability(request.RequestDetails, cancellationToken);

                var httpRequest = new HttpRequestMessage
                {
                    RequestUri = urlBuilder.BuildFromRequest(request.RequestDetails),
                    Method     = request.RequestDetails.Endpoint.GetMethod(),
                    Content    = CreateContent(request),
                };

                logger.LogInformation("Sending request uri:{@uri} method:{@method} body:{@body}", httpRequest.RequestUri, httpRequest.Method, httpRequest.Content);
                var httpResponse = await client.SendAsync(httpRequest, cancellationToken);

                var responseString = await httpResponse.Content.ReadAsStringAsync(cancellationToken);

                _ = relay.Respond(request, httpResponse.StatusCode, responseString, cancellationToken);
                _ = relay.Complete(request, httpResponse.StatusCode, responseString, cancellationToken);
                logger.LogInformation("Received response from {@uri}: {@response}", httpRequest.RequestUri, responseString);

                bucket = await bucketService.MergeBucketIds(bucket, httpResponse, cancellationToken);

                bucketService.UpdateBucketHitsRemaining(bucket, httpResponse);
                bucketService.UpdateBucketResetAfter(bucket, httpResponse);

                if (httpResponse.StatusCode == HttpStatusCode.TooManyRequests)
                {
                    // throw exception here
                    _ = reporter.Report(default(RestApiRateLimitedMetric), cancellationToken);
                }
            }
            catch (Exception exception)
            {
                logger.LogError("Error occurred while attempting to invoke request: {@exception}", exception);
                _ = relay.Fail(request, 0, cancellationToken);
                _ = reporter.Report(default(RestApiFailedMessageMetric), cancellationToken);
            }

            if (bucket != null)
            {
                await bucketRepository.Save(bucket, cancellationToken);
            }
        }
            public async Task ShouldSendRequestWithBuiltUrl(
                Uri url,
                RequestMessage request,
                [Frozen, Substitute] HttpMessageInvoker client,
                [Frozen, Substitute] IUrlBuilder urlBuilder,
                [Target] DefaultRequestInvoker invoker,
                CancellationToken cancellationToken
                )
            {
                urlBuilder.BuildFromRequest(Any <Request>()).Returns(url);
                await invoker.Invoke(request, cancellationToken);

                urlBuilder.Received().BuildFromRequest(Is(request.RequestDetails));
                await client.Received().SendAsync(Any <HttpRequestMessage>(), Is(cancellationToken));

                var httpRequest = TestUtils.GetArg <HttpRequestMessage>(client, nameof(HttpMessageInvoker.SendAsync), 0);

                httpRequest.RequestUri.Should().Be(url);
            }