Esempio n. 1
0
        public async Task Invoke(HttpContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (context.Response.StatusCode == 304 || context.Request.Headers.ContainsKey("X-Esi"))
            {
                await _next(context);

                return;
            }

            var executionContext = new EsiExecutionContext(
                context.Request.Headers.ToDictionary(), context.Request.GetVariablesFromContext());
            var pageUri = context.Request.GetPageUri();

            var(found, cachedResponse) = await _cache.TryGet <FragmentPageResponse>(pageUri, executionContext);

            IEsiFragment fragment;

            if (found)
            {
                context.Response.CopyHeaders(cachedResponse.Headers);
                fragment = cachedResponse.Fragment;
            }
            else
            {
                var acceptEncoding = context.Request.Headers[HeaderNames.AcceptEncoding];
                context.Request.Headers[HeaderNames.AcceptEncoding] = StringValues.Empty;
                var body = await _next.TryIntercept(context);

                context.Request.Headers[HeaderNames.AcceptEncoding] = acceptEncoding;

                if (body == null)
                {
                    return;
                }

                fragment = _parser.Parse(body);

                await StoreFragmentInCache(context, pageUri, executionContext, fragment);
            }

            var content = await _executor.Execute(fragment, executionContext);

            await context.Response.WriteAllAsync(content);
        }