Exemplo n.º 1
0
        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}");
        }