Beispiel #1
0
        private CacheDigestHeaderValue GetCacheDigest(HttpRequestBase request)
        {
            CacheDigestHeaderValue cacheDigest = null;

            if (UseCookieBasedCacheDigest)
            {
                cacheDigest = (request.Cookies[RequestHeaders.CacheDigest] != null) ? new CacheDigestHeaderValue(CacheDigestValue.FromBase64String(request.Cookies[RequestHeaders.CacheDigest].Value), validators: CacheDigestValidators) : null;
            }
            else
            {
                cacheDigest = (request.Headers[RequestHeaders.CacheDigest] != null) ? new CacheDigestHeaderValue(request.Headers[RequestHeaders.CacheDigest]) : null;
            }

            return(cacheDigest);
        }
Beispiel #2
0
        /// <summary>
        /// Called before an action method executes.
        /// </summary>
        /// <param name="filterContext"></param>
        public void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException(nameof(filterContext));
            }

            // HTTP/2 is currently supported only over HTTPS
            if (filterContext.HttpContext.Request.IsSecureConnection)
            {
                CacheDigestHeaderValue cacheDigest = GetCacheDigest(filterContext.HttpContext.Request);

                IDictionary <string, string> cacheDigestUrls = PushPromises(filterContext, cacheDigest);

                SetCacheDigest(filterContext.HttpContext, cacheDigestUrls);
            }
        }
Beispiel #3
0
        private IDictionary <string, string> PushPromises(ActionExecutingContext filterContext, CacheDigestHeaderValue cacheDigest)
        {
            bool newCacheDigestValueNeeded = false;
            IDictionary <string, string> cacheDigestUrls = new Dictionary <string, string>();

            IEnumerable <PushPromiseTable.Entry> pushPromiseEntries = _pushPromiseTable.GetPushPromiseEntries(filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, filterContext.ActionDescriptor.ActionName);

            foreach (PushPromiseTable.Entry pushPromiseEntry in pushPromiseEntries)
            {
                pushPromiseEntry.AbsoluteUrl = pushPromiseEntry.AbsoluteUrl ?? GetAbsolutePushPromiseContentUrl(filterContext.RequestContext, pushPromiseEntry.ContentPath);

                if (!(cacheDigest?.QueryDigest(pushPromiseEntry.AbsoluteUrl, pushPromiseEntry.EntityTag) ?? false))
                {
                    filterContext.HttpContext.Response.PushPromise(pushPromiseEntry.ContentPath);
                    newCacheDigestValueNeeded = newCacheDigestValueNeeded || pushPromiseEntry.TrackInCacheDigest;
                }

                if (UseCookieBasedCacheDigest && pushPromiseEntry.TrackInCacheDigest)
                {
                    cacheDigestUrls.Add(pushPromiseEntry.AbsoluteUrl, pushPromiseEntry.EntityTag);
                }
            }

            return(newCacheDigestValueNeeded ? cacheDigestUrls : null);
        }