// 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); }