Ejemplo n.º 1
0
        protected static async Task <BackendResponse> GetFromBackendAsync(
            IRestClient restClient,
            Func <IRestRequest> createBackendRequestFunc,
            AcceptType acceptType,
            Action <HttpStatusCode> handleNotOkResponseAction,
            CancellationToken cancellationToken)
        {
            var contentType = acceptType.ToMimeTypeString();

            var backendRequest = createBackendRequestFunc();

            backendRequest.AddHeader(HeaderNames.Accept, contentType);

            var response = await ExecuteRequestAsync(restClient, backendRequest, cancellationToken);

            if (response.IsSuccessful && response.StatusCode is HttpStatusCode.OK or HttpStatusCode.Created)
            {
                var downstreamVersion = response
                                        .Headers
                                        .FirstOrDefault(x => x.Name.Equals(AddVersionHeaderMiddleware.HeaderName, StringComparison.InvariantCultureIgnoreCase));

                return(new BackendResponse(
                           response.Content,
                           downstreamVersion?.Value.ToString(),
                           DateTimeOffset.UtcNow,
                           contentType,
                           false,
                           response.HeadersToKeyValuePairs(),
                           response.StatusCode));
            }

            handleNotOkResponseAction(response.StatusCode);

            throw new ApiProblemDetailsException("Fout bij de bron.", (int)response.StatusCode, response.GetProblemDetails(), response.ErrorException);
        }
Ejemplo n.º 2
0
        protected static async Task <BackendResponse> GetFromBackendWithBadRequestAsync(
            IRestClient restClient,
            Func <IRestRequest> createBackendRequestFunc,
            AcceptType acceptType,
            Action <HttpStatusCode> handleNotOkResponseAction,
            ProblemDetailsHelper problemDetailsHelper,
            ICollection <KeyValuePair <string, string> >?headersToForward = null,
            CancellationToken cancellationToken = default)
        {
            var contentType = acceptType.ToMimeTypeString();

            var backendRequest = createBackendRequestFunc();

            backendRequest.AddHeader(HeaderNames.Accept, contentType);
            if (headersToForward != null && headersToForward.Any())
            {
                backendRequest.AddHeaders(headersToForward);
            }

            var response = await ExecuteRequestAsync(restClient, backendRequest, cancellationToken);

            var downstreamVersion = response
                                    .Headers
                                    .FirstOrDefault(x => x.Name.Equals(AddVersionHeaderMiddleware.HeaderName, StringComparison.InvariantCultureIgnoreCase));

            if (response.StatusCode is HttpStatusCode.BadRequest)
            {
                return(new BackendResponse(
                           GetPublicContentValue(response, problemDetailsHelper),
                           downstreamVersion?.Value.ToString(),
                           DateTimeOffset.UtcNow,
                           response.ContentType,
                           false,
                           response.HeadersToKeyValuePairs(),
                           response.StatusCode));
            }

            if (response.IsSuccessful)
            {
                return(new BackendResponse(
                           response.Content,
                           downstreamVersion?.Value.ToString(),
                           DateTimeOffset.UtcNow,
                           contentType,
                           false,
                           response.HeadersToKeyValuePairs(),
                           response.StatusCode));
            }

            handleNotOkResponseAction(response.StatusCode);

            throw new ApiException("Fout bij de bron.", (int)response.StatusCode, response.ErrorException);
        }
Ejemplo n.º 3
0
 public static void SetAcceptType(this HttpRequest request, AcceptType acceptType)
 => request.Headers[HeaderNames.Accept] = acceptType.ToMimeTypeString();
Ejemplo n.º 4
0
        protected async Task <BackendResponse> GetFromCacheThenFromBackendAsync(
            AcceptType acceptType,
            IRestClient restClient,
            Func <IRestRequest> createBackendRequestFunc,
            string cacheKey,
            Action <HttpStatusCode> handleNotOkResponseAction,
            CancellationToken cancellationToken)
        {
            if (_redis != null)
            {
                var key = $"{cacheKey}.{acceptType}".ToLowerInvariant();

                try
                {
                    var db = _redis.GetDatabase();

                    var cachedValues =
                        await db.HashGetAllAsync(
                            key,
                            CommandFlags.PreferReplica);

                    if (cachedValues.Length > 0)
                    {
                        var cachedSetByRegistry = cachedValues.First(x => x.Name.Equals(SetByRegistryKey));

                        if (cachedSetByRegistry.Value == true.ToString(CultureInfo.InvariantCulture))
                        {
                            var cachedValue        = cachedValues.FirstOrDefault(x => x.Name.Equals(ValueKey));
                            var cachedHeaders      = cachedValues.FirstOrDefault(x => x.Name.Equals(HeadersKey));
                            var cachedLastModified = cachedValues.FirstOrDefault(x => x.Name.Equals(LastModifiedKey));

                            var headers = JsonConvert.DeserializeObject <Dictionary <string, string[]> >(cachedHeaders.Value);
                            headers.TryGetValue(AddVersionHeaderMiddleware.HeaderName, out var downstreamVersion);

                            return(new BackendResponse(
                                       cachedValue.Value,
                                       downstreamVersion?.First(),
                                       DateTimeOffset.ParseExact(
                                           cachedLastModified.Value,
                                           "O",
                                           CultureInfo.InvariantCulture),
                                       acceptType.ToMimeTypeString(),
                                       true,
                                       Enumerable.Empty <KeyValuePair <string, StringValues> >()));
                        }

                        _logger.LogError("Failed to retrieve record {Record} from Redis, cached values not set by registry.", key);
                    }
                    else
                    {
                        _logger.LogError("Failed to retrieve record {Record} from Redis, no cached values.", key);
                    }
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, "Failed to retrieve record {Record} from Redis.", key);
                }
            }

            return(await GetFromBackendAsync(
                       restClient,
                       createBackendRequestFunc,
                       acceptType,
                       handleNotOkResponseAction,
                       cancellationToken));
        }