Beispiel #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);
            }
        }