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