private void GivenCacheKeyFromContext(DownstreamContext context) { string generatedCacheKey = _cacheKeyGenerator.GenerateRequestCacheKey(context); string cachekey = MD5Helper.GenerateMd5("GET-https://some.url/blah?abcd=123"); generatedCacheKey.ShouldBe(cachekey); }
public async Task Process(HttpContext context, Func <HttpContext, Task> next) { var downstreamRoute = context.Items.DownstreamRoute(); if (!downstreamRoute.IsCached) { await next.Invoke(context); return; } try { var downstreamRequest = context.Items.DownstreamRequest(); var downstreamUrlKey = $"{downstreamRequest.Method}-{downstreamRequest.OriginalString}"; var downStreamRequestCacheKey = _cacheGenerator.GenerateRequestCacheKey(downstreamRequest); _logger.LogDebug("Started checking cache for {Url}", downstreamUrlKey); var cached = _outputCache.Get(downStreamRequestCacheKey, downstreamRoute.CacheOptions.Region); if (cached != null) { _logger.LogDebug("cache entry exists for {Url}. Data length {length}", downstreamUrlKey, cached.Body?.Length ?? 0); context.Response.ContentType = MediaTypeNames.Application.Json; context.Items.UpsertDownstreamResponse(CreateHttpResponseMessage(cached)); _logger.LogDebug("finished returned cached response for {Url}", downstreamUrlKey); return; } _logger.LogDebug("no response cached for {Url}", downstreamUrlKey); await next.Invoke(context); // prevent caching errors var downstreamResponse = context.Items.DownstreamResponse(); if (downstreamResponse == null || (int)downstreamResponse.StatusCode >= 400) { _logger.LogDebug("there was a pipeline error for {Url}", downstreamUrlKey); return; } cached = await CreateCachedResponse(downstreamResponse); _outputCache.Add(downStreamRequestCacheKey, cached, TimeSpan.FromSeconds(downstreamRoute.CacheOptions.TtlSeconds), downstreamRoute.CacheOptions.Region); _logger.LogDebug("finished response added to cache for {Url}. Data length {length}", downstreamUrlKey, cached?.Body?.Length ?? 0); } catch (Exception e) { _logger.LogError(e, e.Message); throw; } }
public async Task Invoke(HttpContext httpContext) { var downstreamRoute = httpContext.Items.DownstreamRoute(); if (!downstreamRoute.IsCached) { await _next.Invoke(httpContext); return; } var downstreamRequest = httpContext.Items.DownstreamRequest(); var downstreamUrlKey = $"{downstreamRequest.Method}-{downstreamRequest.OriginalString}"; string downStreamRequestCacheKey = _cacheGenerator.GenerateRequestCacheKey(downstreamRequest); Logger.LogDebug($"Started checking cache for {downstreamUrlKey}"); var cached = _outputCache.Get(downStreamRequestCacheKey, downstreamRoute.CacheOptions.Region); if (cached != null) { Logger.LogDebug($"cache entry exists for {downstreamUrlKey}"); var response = CreateHttpResponseMessage(cached); SetHttpResponseMessageThisRequest(httpContext, response); Logger.LogDebug($"finished returned cached response for {downstreamUrlKey}"); return; } Logger.LogDebug($"no resonse cached for {downstreamUrlKey}"); await _next.Invoke(httpContext); if (httpContext.Items.Errors().Count > 0) { Logger.LogDebug($"there was a pipeline error for {downstreamUrlKey}"); return; } var downstreamResponse = httpContext.Items.DownstreamResponse(); cached = await CreateCachedResponse(downstreamResponse); _outputCache.Add(downStreamRequestCacheKey, cached, TimeSpan.FromSeconds(downstreamRoute.CacheOptions.TtlSeconds), downstreamRoute.CacheOptions.Region); Logger.LogDebug($"finished response added to cache for {downstreamUrlKey}"); }