private static TriState CheckForRangeRequest(HttpRequestCacheValidator ctx, out string ranges) {
if ((ranges = ctx.Request.Headers[HttpKnownHeaderNames.Range]) != null) {
// A request already contains range.
// The caller will either return it from cache or pass as is to the server
ctx.RequestRangeUser = true;
if(Logging.On)Logging.PrintInfo(Logging.RequestCache, SR.GetString(SR.net_log_cache_range_request_range, ctx.Request.Headers[HttpKnownHeaderNames.Range]));
return TriState.Invalid;
}
if (ctx.CacheStatusCode == HttpStatusCode.PartialContent && ctx.CacheEntityLength == ctx.CacheEntry.StreamSize)
{
// this is a whole resposne
ctx.CacheStatusCode = HttpStatusCode.OK;
ctx.CacheStatusDescription = Common.OkDescription;
return TriState.Unknown;
}
if (ctx.CacheEntry.IsPartialEntry || (ctx.CacheEntityLength != -1 && ctx.CacheEntityLength != ctx.CacheEntry.StreamSize) || ctx.CacheStatusCode == HttpStatusCode.PartialContent)
{ //The cache may contain a partial response
if(Logging.On)Logging.PrintInfo(Logging.RequestCache, SR.GetString(SR.net_log_cache_could_be_partial, ctx.CacheEntry.StreamSize, ctx.CacheEntityLength));
return TriState.Valid;
}
return TriState.Unknown;
}