System.Net.Cache.Rfc2616.OnValidateRequest C# (CSharp) Method

OnValidateRequest() public static method

public static OnValidateRequest ( HttpRequestCacheValidator ctx ) : CacheValidationStatus
ctx HttpRequestCacheValidator
return CacheValidationStatus
        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;
        }
        /*----------*/