internal CacheValidationStatus GetRetrieveStatus (Uri cacheUri, WebRequest request)
{
if (cacheUri == null)
throw new ArgumentNullException("cacheUri");
if (request == null)
throw new ArgumentNullException("request");
if (!_CanTakeNewRequest || _ProtocolStatus == CacheValidationStatus.RetryResponseFromServer)
return CacheValidationStatus.Continue;
_CanTakeNewRequest = false;
// Reset protocol state
_ResponseStream = null;
_ResponseStreamLength = 0L;
_ProtocolStatus = CacheValidationStatus.Continue;
_ProtocolException = null;
if(Logging.On) Logging.Enter(Logging.RequestCache, this, "GetRetrieveStatus", request);
try {
if (request.CachePolicy == null || request.CachePolicy.Level == RequestCacheLevel.BypassCache)
{
_ProtocolStatus = CacheValidationStatus.DoNotUseCache;
return _ProtocolStatus;
}
if (_RequestCache == null || _Validator == null)
{
_ProtocolStatus = CacheValidationStatus.DoNotUseCache;
return _ProtocolStatus;
}
_Validator.FetchRequest(cacheUri, request);
switch(_ProtocolStatus = ValidateRequest())
{
case CacheValidationStatus.Continue: // This is a green light for cache protocol
break;
case CacheValidationStatus.DoNotTakeFromCache: // no cache but response can be cached
case CacheValidationStatus.DoNotUseCache: // ignore cache entirely
break;
case CacheValidationStatus.Fail:
_ProtocolException = new InvalidOperationException(SR.GetString(SR.net_cache_validator_fail, "ValidateRequest"));
break;
default:
_ProtocolStatus = CacheValidationStatus.Fail;
_ProtocolException = new InvalidOperationException(SR.GetString(SR.net_cache_validator_result, "ValidateRequest", _Validator.ValidationStatus.ToString()));
if(Logging.On) Logging.PrintError(Logging.RequestCache, SR.GetString(SR.net_log_cache_unexpected_status, "ValidateRequest()", _Validator.ValidationStatus.ToString()));
break;
}
if (_ProtocolStatus != CacheValidationStatus.Continue)
return _ProtocolStatus;
//
// Proceed with validation
//
CheckRetrieveBeforeSubmit();
}
catch (Exception e) {
_ProtocolException = e;
_ProtocolStatus = CacheValidationStatus.Fail;
if (e is ThreadAbortException || e is StackOverflowException || e is OutOfMemoryException)
throw;
if(Logging.On) Logging.PrintError(Logging.RequestCache, SR.GetString(SR.net_log_cache_object_and_exception, "CacheProtocol#" + this.GetHashCode().ToString(NumberFormatInfo.InvariantInfo), (e is WebException? e.Message: e.ToString())));
}
finally {
if(Logging.On) Logging.Exit(Logging.RequestCache, this, "GetRetrieveStatus", "result = " + _ProtocolStatus.ToString());
}
return _ProtocolStatus;
}
//