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); }
/// <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); } }
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); }