void DoCacheInsert (HttpContext context, HttpApplication app, HttpResponse response)
{
string vary_key = context.Request.FilePath;
string key;
OutputCacheProvider provider = FindCacheProvider (app);
CachedVaryBy varyby = provider.Get (vary_key) as CachedVaryBy;
CachedRawResponse prev = null;
bool lookup = true;
string cacheKey = null, cacheValue = null;
HttpCachePolicy cachePolicy = response.Cache;
if (varyby == null) {
varyby = new CachedVaryBy (cachePolicy, vary_key);
provider.Add (vary_key, varyby, Cache.NoAbsoluteExpiration);
lookup = false;
cacheKey = vary_key;
}
key = varyby.CreateKey (vary_key, context);
if (lookup)
prev = provider.Get (key) as CachedRawResponse;
if (prev == null) {
CachedRawResponse c = response.GetCachedResponse ();
if (c != null) {
string [] keys = new string [] { vary_key };
DateTime utcExpiry, absoluteExpiration;
TimeSpan slidingExpiration;
c.VaryBy = varyby;
varyby.ItemList.Add (key);
if (cachePolicy.Sliding) {
slidingExpiration = TimeSpan.FromSeconds (cachePolicy.Duration);
absoluteExpiration = Cache.NoAbsoluteExpiration;
utcExpiry = DateTime.UtcNow + slidingExpiration;
} else {
slidingExpiration = Cache.NoSlidingExpiration;
absoluteExpiration = cachePolicy.Expires;
utcExpiry = absoluteExpiration.ToUniversalTime ();
}
provider.Set (key, c, utcExpiry);
HttpRuntime.InternalCache.Insert (key, c, new CacheDependency (null, keys), absoluteExpiration, slidingExpiration,
CacheItemPriority.Normal, response_removed);
cacheValue = key;
}
}
if (cacheKey != null) {
lock (keysCacheLock) {
if (keysCache == null) {
BuildManager.RemoveEntry += new BuildManagerRemoveEntryEventHandler (OnBuildManagerRemoveEntry);
keysCache = new Dictionary <string, string> (StringComparer.Ordinal);
keysCache.Add (cacheKey, cacheValue);
} else if (!keysCache.ContainsKey (cacheKey))
keysCache.Add (cacheKey, cacheValue);
}
}
}