public static CacheValidationStatus OnValidateRequest(HttpRequestCacheValidator ctx)
{
CacheValidationStatus result = Common.OnValidateRequest(ctx);
if (result == CacheValidationStatus.DoNotUseCache)
{
return result;
}
/*
HTTP/1.1 caches SHOULD treat "Pragma: no-cache" as if the client had
sent "Cache-Control: no-cache". No new Pragma directives will be
defined in HTTP.
we use above information to nuke pragma header (we control it itself)
*/
ctx.Request.Headers.RemoveInternal(HttpKnownHeaderNames.Pragma);
/*
we want to control cache-control header as well, any specifi extensions should be done
using a derived validator class and custom policy
*/
ctx.Request.Headers.RemoveInternal(HttpKnownHeaderNames.CacheControl);
if (ctx.Policy.Level == HttpRequestCacheLevel.NoCacheNoStore)
{
//adjust request headers since retrieval validators will be suppressed upon return.
ctx.Request.Headers.AddInternal(HttpKnownHeaderNames.CacheControl, "no-store");
ctx.Request.Headers.AddInternal(HttpKnownHeaderNames.CacheControl, "no-cache");
ctx.Request.Headers.AddInternal(HttpKnownHeaderNames.Pragma, "no-cache");
result = CacheValidationStatus.DoNotTakeFromCache;
}
else if (result == CacheValidationStatus.Continue)
{
if (ctx.Policy.Level == HttpRequestCacheLevel.Reload || ctx.Policy.Level == HttpRequestCacheLevel.NoCacheNoStore)
{
//adjust request headers since retrieval validators will be suppressed upon return.
ctx.Request.Headers.AddInternal(HttpKnownHeaderNames.CacheControl, "no-cache");
ctx.Request.Headers.AddInternal(HttpKnownHeaderNames.Pragma, "no-cache");
result = CacheValidationStatus.DoNotTakeFromCache;
}
else if (ctx.Policy.Level == HttpRequestCacheLevel.Refresh)
{
//adjust request headers since retrieval validators will be suppressed upon return.
ctx.Request.Headers.AddInternal(HttpKnownHeaderNames.CacheControl, "max-age=0");
ctx.Request.Headers.AddInternal(HttpKnownHeaderNames.Pragma, "no-cache");
result = CacheValidationStatus.DoNotTakeFromCache;
}
else if (ctx.Policy.Level == HttpRequestCacheLevel.Default)
{
//Transfer Policy into CacheControl directives
if (ctx.Policy.MinFresh > TimeSpan.Zero) {
ctx.Request.Headers.AddInternal(HttpKnownHeaderNames.CacheControl, "min-fresh=" + (int)ctx.Policy.MinFresh.TotalSeconds);
}
if (ctx.Policy.MaxAge != TimeSpan.MaxValue) {
ctx.Request.Headers.AddInternal(HttpKnownHeaderNames.CacheControl, "max-age=" + (int)ctx.Policy.MaxAge.TotalSeconds);
}
if (ctx.Policy.MaxStale > TimeSpan.Zero) {
ctx.Request.Headers.AddInternal(HttpKnownHeaderNames.CacheControl, "max-stale=" + (int)ctx.Policy.MaxStale.TotalSeconds);
}
}
else if (ctx.Policy.Level == HttpRequestCacheLevel.CacheOnly || ctx.Policy.Level == HttpRequestCacheLevel.CacheOrNextCacheOnly)
{
// In case other validators will not be called
ctx.Request.Headers.AddInternal(HttpKnownHeaderNames.CacheControl, "only-if-cached");
}
}
return result;
}
/*----------*/