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