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); }
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); }
public static void SetAcceptType(this HttpRequest request, AcceptType acceptType) => request.Headers[HeaderNames.Accept] = acceptType.ToMimeTypeString();
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)); }