Exemple #1
0
        public bool ProcessConditionalHeader(ConditionalHeaders condHeaders, NameValueCollection requestHeaders, OperationTypeForConditionParsing operationType, string requestVersion, ConditionInformation outputCondition)
        {
            DateTime?nullable;

            if (!string.IsNullOrEmpty(condHeaders.IfRange))
            {
                return(false);
            }
            if (string.IsNullOrEmpty(condHeaders.IfModifiedSince))
            {
                return(false);
            }
            outputCondition.ConditionFailStatusCode = HttpStatusCode.NotModified;
            if (!HttpUtilities.TryGetDateTimeFromHttpString(condHeaders.IfModifiedSince, out nullable))
            {
                throw new InvalidHeaderProtocolException("If-Modified-Since", condHeaders.IfModifiedSince);
            }
            outputCondition.IfModifiedSince         = new DateTime?((nullable.Value < DateTime.MaxValue.AddSeconds(-1) ? nullable.Value.AddSeconds(1) : nullable.Value));
            outputCondition.ResourceExistsCondition = new ResourceExistenceCondition?(ResourceExistenceCondition.MayExist);
            return(true);
        }
Exemple #2
0
        protected override bool ProcessConditionalHeader(ConditionalHeaders condHeaders, NameValueCollection requestHeaders, OperationTypeForConditionParsing operationType, string requestVersion, out ConditionInformation outputCondition)
        {
            DateTime?nullable;

            if (!ConditionExtractor.ShouldThisVersionFailMultipleConditions(requestVersion))
            {
                if (!string.IsNullOrEmpty(condHeaders.IfRange))
                {
                    outputCondition = null;
                    return(false);
                }
                if (string.IsNullOrEmpty(condHeaders.CopySourceIfUnmodifiedSince) || !string.IsNullOrEmpty(condHeaders.CopySourceIfMatch))
                {
                    outputCondition = null;
                    return(false);
                }
                if (!string.IsNullOrEmpty(condHeaders.CopySourceIfModifiedSince) || !string.IsNullOrEmpty(condHeaders.CopySourceIfNoneMatch))
                {
                    outputCondition = null;
                    return(false);
                }
            }
            else
            {
                if (string.IsNullOrEmpty(condHeaders.CopySourceIfUnmodifiedSince))
                {
                    outputCondition = null;
                    return(false);
                }
                if (!string.IsNullOrEmpty(condHeaders.CopySourceIfMatch))
                {
                    outputCondition = null;
                    return(false);
                }
                if (!string.IsNullOrEmpty(condHeaders.CopySourceIfModifiedSince) || !string.IsNullOrEmpty(condHeaders.CopySourceIfNoneMatch))
                {
                    throw new MultipleConditionHeaderProtocolException();
                }
            }
            ConditionInformation conditionInformation = new ConditionInformation()
            {
                ConditionFailStatusCode = HttpStatusCode.PreconditionFailed
            };

            if (!HttpUtilities.TryGetDateTimeFromHttpString(condHeaders.CopySourceIfUnmodifiedSince, out nullable))
            {
                throw new InvalidHeaderProtocolException("x-ms-source-if-unmodified-since", condHeaders.CopySourceIfUnmodifiedSince);
            }
            conditionInformation.CopySourceIfNotModifiedSince = new DateTime?((nullable.Value < DateTime.MaxValue.AddSeconds(-1) ? nullable.Value.AddSeconds(1) : nullable.Value));
            outputCondition = conditionInformation;
            return(true);
        }
Exemple #3
0
        public bool ProcessConditionalHeader(ConditionalHeaders condHeaders, NameValueCollection requestHeaders, OperationTypeForConditionParsing operationType, string requestVersion, ConditionInformation outputCondition)
        {
            bool?nullable;

            if (!string.IsNullOrEmpty(condHeaders.IfRange))
            {
                return(false);
            }
            if (string.IsNullOrEmpty(condHeaders.IfMatch))
            {
                return(false);
            }
            outputCondition.ConditionFailStatusCode = HttpStatusCode.PreconditionFailed;
            outputCondition.ResourceExistsCondition = new ResourceExistenceCondition?(ResourceExistenceCondition.MustExist);
            string ifMatch = condHeaders.IfMatch;

            string[]        strArrays  = new string[] { "," };
            string[]        strArrays1 = ifMatch.Split(strArrays, StringSplitOptions.RemoveEmptyEntries);
            List <DateTime> dateTimes  = new List <DateTime>();

            string[] strArrays2 = strArrays1;
            for (int i = 0; i < (int)strArrays2.Length; i++)
            {
                string str = strArrays2[i];
                if (Comparison.StringEqualsIgnoreCase(str, "*"))
                {
                    return(false);
                }
                try
                {
                    dateTimes.Add(BasicHttpProcessor.GetLastModifiedTimeFromETag(str));
                }
                catch (InvalidHeaderProtocolException invalidHeaderProtocolException1)
                {
                    InvalidHeaderProtocolException invalidHeaderProtocolException = invalidHeaderProtocolException1;
                    if (!VersioningHelper.IsPreSeptember09OrInvalidVersion(requestVersion))
                    {
                        if (operationType == OperationTypeForConditionParsing.CopyOperation)
                        {
                            nullable = new bool?(false);
                        }
                        else
                        {
                            nullable = null;
                        }
                        throw new UnrecognizedIfMatchConditionException(nullable, invalidHeaderProtocolException);
                    }
                    throw;
                }
            }
            if (dateTimes.Count > 0)
            {
                outputCondition.IfMatch = dateTimes.ToArray();
            }
            if (outputCondition != null && (int)outputCondition.IfMatch.Length > 0)
            {
                return(true);
            }
            return(false);
        }
Exemple #4
0
        public bool ProcessConditionalHeader(ConditionalHeaders condHeaders, NameValueCollection requestHeaders, OperationTypeForConditionParsing operationType, string requestVersion, ConditionInformation outputCondition)
        {
            if (!string.IsNullOrEmpty(condHeaders.IfRange))
            {
                return(false);
            }
            if (string.IsNullOrEmpty(condHeaders.IfNoneMatch))
            {
                return(false);
            }
            outputCondition.ConditionFailStatusCode = HttpStatusCode.NotModified;
            string ifNoneMatch = condHeaders.IfNoneMatch;

            string[]        strArrays  = new string[] { "," };
            string[]        strArrays1 = ifNoneMatch.Split(strArrays, StringSplitOptions.RemoveEmptyEntries);
            List <DateTime> dateTimes  = new List <DateTime>();

            string[] strArrays2 = strArrays1;
            for (int i = 0; i < (int)strArrays2.Length; i++)
            {
                string str = strArrays2[i];
                if (Comparison.StringEqualsIgnoreCase(str, "*"))
                {
                    if (!VersioningHelper.IsPreFebruary16OrInvalidVersion(requestVersion))
                    {
                        throw new UnsatisfiableConditionException();
                    }
                    return(false);
                }
                dateTimes.Add(BasicHttpProcessor.GetLastModifiedTimeFromETag(str));
            }
            if (dateTimes.Count > 0)
            {
                outputCondition.IfNoneMatch = dateTimes.ToArray();
            }
            if (outputCondition == null)
            {
                return(false);
            }
            return((int)outputCondition.IfNoneMatch.Length > 0);
        }
Exemple #5
0
 public bool ProcessConditionalHeader(ConditionalHeaders condHeaders, NameValueCollection requestHeaders, OperationTypeForConditionParsing operationType, string requestVersion, ConditionInformation outputCondition)
 {
     if (ConditionExtractor.ShouldThisVersionFailMultipleConditions(requestVersion))
     {
         return(false);
     }
     if (string.IsNullOrEmpty(condHeaders.IfRange))
     {
         return(false);
     }
     HttpRequestAccessorCommon.RemoveRangeHeaderValues(requestHeaders);
     return(true);
 }
Exemple #6
0
        private static ConditionInformation ExecuteExtractors(ConditionalHeaders condHeaders, NameValueCollection requestHeaders, OperationTypeForConditionParsing operationType, string requestVersion, IConditionExtractor[] extractors)
        {
            ConditionInformation conditionInformation = new ConditionInformation()
            {
                IsMultipleConditionalHeaderEnabled = true
            };

            IConditionExtractor[] conditionExtractorArray = extractors;
            for (int i = 0; i < (int)conditionExtractorArray.Length; i++)
            {
                IConditionExtractor conditionExtractor = conditionExtractorArray[i];
                try
                {
                    conditionExtractor.ProcessConditionalHeader(condHeaders, requestHeaders, operationType, requestVersion, conditionInformation);
                }
                catch (InvalidHeaderProtocolException invalidHeaderProtocolException)
                {
                }
            }
            return(conditionInformation);
        }
Exemple #7
0
        public static ConditionInformation GetConditionInfoFromRequest(NameValueCollection requestHeaders, OperationTypeForConditionParsing operationType, string requestVersion)
        {
            ConditionalHeaders conditionalHeadersFromRequest = ConditionExtractor.GetConditionalHeadersFromRequest(requestHeaders);

            if (conditionalHeadersFromRequest == null)
            {
                return(null);
            }
            IStringDataEventStream info = Logger <IRestProtocolHeadLogger> .Instance.Info;

            object[] ifModifiedSince = new object[] { conditionalHeadersFromRequest.IfModifiedSince ?? "<null>", conditionalHeadersFromRequest.IfUnmodifiedSince ?? "<null>", conditionalHeadersFromRequest.IfMatch ?? "<null>", conditionalHeadersFromRequest.IfNoneMatch ?? "<null>", conditionalHeadersFromRequest.IfRange ?? "<null>", conditionalHeadersFromRequest.CopySourceIfModifiedSince ?? "<null>", conditionalHeadersFromRequest.CopySourceIfUnmodifiedSince ?? "<null>", conditionalHeadersFromRequest.CopySourceIfMatch ?? "<null>", conditionalHeadersFromRequest.CopySourceIfNoneMatch ?? "<null>" };
            info.Log("Conditional Headers:[IfModifiedSince = {0}, IfUnmodifiedSince = {1}, IfMatch = {2}, IfNoneMatch = {3}, IfRange = {4}, CopySourceIfModifiedSince = {5}, CopySourceIfUnmodifiedSince = {6}, CopySourceIfMatch = {7}, CopySourceIfNoneMatch = {8}]", ifModifiedSince);
            return(MultipleConditionExtractor.ExecuteExtractors(conditionalHeadersFromRequest, requestHeaders, operationType, requestVersion, MultipleConditionExtractor.Extractors));
        }
Exemple #8
0
        private static ConditionInformation ExecuteExtractors(ConditionalHeaders condHeaders, NameValueCollection requestHeaders, OperationTypeForConditionParsing operationType, string requestVersion, ConditionExtractor[] extractors)
        {
            ConditionInformation conditionInformation;
            ConditionInformation conditionInformation1 = null;

            ConditionExtractor[] conditionExtractorArray = extractors;
            int num = 0;

Label1:
            while (num < (int)conditionExtractorArray.Length)
            {
                ConditionExtractor conditionExtractor = conditionExtractorArray[num];
                try
                {
                    if (!conditionExtractor.ProcessConditionalHeader(condHeaders, requestHeaders, operationType, requestVersion, out conditionInformation1))
                    {
                        goto Label0;
                    }
                    else
                    {
                        conditionInformation = conditionInformation1;
                    }
                }
                catch (InvalidHeaderProtocolException invalidHeaderProtocolException)
                {
                    conditionInformation = null;
                }
                return(conditionInformation);
            }
            return(null);

Label0:
            num++;
            goto Label1;
        }
Exemple #9
0
        protected override bool ProcessConditionalHeader(ConditionalHeaders condHeaders, NameValueCollection requestHeaders, OperationTypeForConditionParsing operationType, string requestVersion, out ConditionInformation outputCondition)
        {
            DateTime?nullable;

            if (!ConditionExtractor.ShouldThisVersionFailMultipleConditions(requestVersion))
            {
                if (!string.IsNullOrEmpty(condHeaders.IfRange))
                {
                    outputCondition = null;
                    return(false);
                }
                if (string.IsNullOrEmpty(condHeaders.IfModifiedSince) || !string.IsNullOrEmpty(condHeaders.IfNoneMatch))
                {
                    outputCondition = null;
                    return(false);
                }
                if (!string.IsNullOrEmpty(condHeaders.IfMatch) || !string.IsNullOrEmpty(condHeaders.IfUnmodifiedSince))
                {
                    outputCondition = null;
                    return(false);
                }
            }
            else
            {
                if (string.IsNullOrEmpty(condHeaders.IfModifiedSince))
                {
                    outputCondition = null;
                    return(false);
                }
                if (!string.IsNullOrEmpty(condHeaders.IfNoneMatch))
                {
                    outputCondition = null;
                    return(false);
                }
                if (!string.IsNullOrEmpty(condHeaders.IfUnmodifiedSince) || !string.IsNullOrEmpty(condHeaders.IfMatch))
                {
                    throw new MultipleConditionHeaderProtocolException();
                }
            }
            ConditionInformation conditionInformation = new ConditionInformation();

            if (operationType == OperationTypeForConditionParsing.CopyOperation)
            {
                conditionInformation.ConditionFailStatusCode = HttpStatusCode.PreconditionFailed;
            }
            else if (operationType != OperationTypeForConditionParsing.WriteOperation)
            {
                conditionInformation.ConditionFailStatusCode = HttpStatusCode.NotModified;
            }
            else if (!VersioningHelper.IsPreSeptember09OrInvalidVersion(requestVersion))
            {
                conditionInformation.ConditionFailStatusCode = HttpStatusCode.PreconditionFailed;
            }
            else
            {
                conditionInformation.ConditionFailStatusCode = HttpStatusCode.NotModified;
            }
            if (!HttpUtilities.TryGetDateTimeFromHttpString(condHeaders.IfModifiedSince, out nullable))
            {
                throw new InvalidHeaderProtocolException("If-Modified-Since", condHeaders.IfModifiedSince);
            }
            conditionInformation.IfModifiedSince         = new DateTime?((nullable.Value < DateTime.MaxValue.AddSeconds(-1) ? nullable.Value.AddSeconds(1) : nullable.Value));
            conditionInformation.ResourceExistsCondition = new ResourceExistenceCondition?(ResourceExistenceCondition.MayExist);
            outputCondition = conditionInformation;
            return(true);
        }
Exemple #10
0
 protected abstract bool ProcessConditionalHeader(ConditionalHeaders conditionalHeaders, NameValueCollection requestHeaders, OperationTypeForConditionParsing operationType, string requestVersion, out ConditionInformation ci);
Exemple #11
0
        public static ConditionInformation GetConditionInfoFromRequest(NameValueCollection requestHeaders, OperationTypeForConditionParsing operationType, string requestVersion)
        {
            ConditionalHeaders conditionalHeadersFromRequest = ConditionExtractor.GetConditionalHeadersFromRequest(requestHeaders);

            if (conditionalHeadersFromRequest == null)
            {
                return(null);
            }
            if (operationType == OperationTypeForConditionParsing.ReadOperation || operationType == OperationTypeForConditionParsing.WriteOperation)
            {
                return(ConditionExtractor.ExecuteExtractors(conditionalHeadersFromRequest, requestHeaders, operationType, requestVersion, ConditionExtractor.extractors));
            }
            NephosAssertionException.Assert(operationType == OperationTypeForConditionParsing.CopyOperation);
            ConditionInformation copySourceIfModifiedSince = ConditionExtractor.ExecuteExtractors(conditionalHeadersFromRequest, requestHeaders, operationType, requestVersion, ConditionExtractor.extractors);
            ConditionInformation conditionInformation      = ConditionExtractor.ExecuteExtractors(conditionalHeadersFromRequest, requestHeaders, operationType, requestVersion, ConditionExtractor.copySourceExtractors);

            if (copySourceIfModifiedSince == null)
            {
                return(conditionInformation);
            }
            if (conditionInformation != null)
            {
                copySourceIfModifiedSince.CopySourceIfModifiedSince    = conditionInformation.CopySourceIfModifiedSince;
                copySourceIfModifiedSince.CopySourceIfNotModifiedSince = conditionInformation.CopySourceIfNotModifiedSince;
                copySourceIfModifiedSince.CopySourceIfMatch            = conditionInformation.CopySourceIfMatch;
                copySourceIfModifiedSince.CopySourceIfNoneMatch        = conditionInformation.CopySourceIfNoneMatch;
                NephosAssertionException.Assert(copySourceIfModifiedSince.ConditionFailStatusCode == conditionInformation.ConditionFailStatusCode);
            }
            return(copySourceIfModifiedSince);
        }
Exemple #12
0
        public static ConditionInformation GetConditionInfoFromIncrementalCopyRequest(NameValueCollection requestHeaders, OperationTypeForConditionParsing operationType, string requestVersion)
        {
            ConditionalHeaders conditionalHeadersFromRequest = ConditionExtractor.GetConditionalHeadersFromRequest(requestHeaders);

            if (conditionalHeadersFromRequest == null)
            {
                return(null);
            }
            return(ConditionExtractor.ExecuteExtractors(conditionalHeadersFromRequest, requestHeaders, operationType, requestVersion, ConditionExtractor.extractors));
        }
Exemple #13
0
        protected override bool ProcessConditionalHeader(ConditionalHeaders condHeaders, NameValueCollection requestHeaders, OperationTypeForConditionParsing operationType, string requestVersion, out ConditionInformation outputCondition)
        {
            DateTime lastModifiedTimeFromETag;
            DateTime?nullable = null;

            if (!ConditionExtractor.ShouldThisVersionFailMultipleConditions(requestVersion))
            {
                if (!string.IsNullOrEmpty(condHeaders.IfRange))
                {
                    outputCondition = null;
                    return(false);
                }
                if (string.IsNullOrEmpty(condHeaders.CopySourceIfMatch))
                {
                    outputCondition = null;
                    return(false);
                }
                if (!string.IsNullOrEmpty(condHeaders.CopySourceIfNoneMatch) || !string.IsNullOrEmpty(condHeaders.CopySourceIfModifiedSince))
                {
                    outputCondition = null;
                    return(false);
                }
                if (Comparison.StringContains(condHeaders.CopySourceIfMatch, ","))
                {
                    throw new InvalidHeaderProtocolException("x-ms-source-if-match", condHeaders.CopySourceIfMatch);
                }
                if (!string.IsNullOrEmpty(condHeaders.CopySourceIfUnmodifiedSince) && !HttpUtilities.TryGetDateTimeFromHttpString(condHeaders.CopySourceIfUnmodifiedSince, out nullable))
                {
                    throw new InvalidHeaderProtocolException("x-ms-source-if-unmodified-since", condHeaders.CopySourceIfUnmodifiedSince);
                }
            }
            else
            {
                if (string.IsNullOrEmpty(condHeaders.CopySourceIfMatch))
                {
                    outputCondition = null;
                    return(false);
                }
                if (!string.IsNullOrEmpty(condHeaders.CopySourceIfModifiedSince) || !string.IsNullOrEmpty(condHeaders.CopySourceIfNoneMatch))
                {
                    throw new MultipleConditionHeaderProtocolException();
                }
                if (Comparison.StringContains(condHeaders.CopySourceIfMatch, ","))
                {
                    throw new MultipleConditionHeaderProtocolException();
                }
            }
            ConditionInformation conditionInformation = new ConditionInformation()
            {
                ConditionFailStatusCode = HttpStatusCode.PreconditionFailed
            };

            if (Comparison.StringEqualsIgnoreCase(condHeaders.CopySourceIfMatch, "*"))
            {
                outputCondition = null;
                return(false);
            }
            try
            {
                lastModifiedTimeFromETag = BasicHttpProcessor.GetLastModifiedTimeFromETag(condHeaders.CopySourceIfMatch);
            }
            catch (InvalidHeaderProtocolException invalidHeaderProtocolException1)
            {
                InvalidHeaderProtocolException invalidHeaderProtocolException = invalidHeaderProtocolException1;
                if (!VersioningHelper.IsPreSeptember09OrInvalidVersion(requestVersion))
                {
                    throw new UnrecognizedIfMatchConditionException(new bool?(true), invalidHeaderProtocolException);
                }
                throw;
            }
            if (!VersioningHelper.IsPreSeptember09OrInvalidVersion(requestVersion))
            {
                conditionInformation.CopySourceIfMatch = new DateTime?(lastModifiedTimeFromETag);
            }
            else
            {
                conditionInformation.CopySourceIfNotModifiedSince = new DateTime?(lastModifiedTimeFromETag);
            }
            if (nullable.HasValue && !HttpUtilities.DateTimesEqualsUpToSeconds(nullable.Value, lastModifiedTimeFromETag))
            {
                outputCondition = null;
                return(false);
            }
            outputCondition = conditionInformation;
            return(true);
        }
Exemple #14
0
        protected override bool ProcessConditionalHeader(ConditionalHeaders condHeaders, NameValueCollection requestHeaders, OperationTypeForConditionParsing operationType, string requestVersion, out ConditionInformation outputCondition)
        {
            DateTime lastModifiedTimeFromETag;
            bool?    nullable;
            DateTime?nullable1 = null;

            if (!ConditionExtractor.ShouldThisVersionFailMultipleConditions(requestVersion))
            {
                if (!string.IsNullOrEmpty(condHeaders.IfRange))
                {
                    outputCondition = null;
                    return(false);
                }
                if (string.IsNullOrEmpty(condHeaders.IfMatch))
                {
                    outputCondition = null;
                    return(false);
                }
                if (!string.IsNullOrEmpty(condHeaders.IfNoneMatch) || !string.IsNullOrEmpty(condHeaders.IfModifiedSince))
                {
                    outputCondition = null;
                    return(false);
                }
                if (Comparison.StringContains(condHeaders.IfMatch, ","))
                {
                    throw new InvalidHeaderProtocolException("If-Match", condHeaders.IfMatch);
                }
                if (!string.IsNullOrEmpty(condHeaders.IfUnmodifiedSince) && !HttpUtilities.TryGetDateTimeFromHttpString(condHeaders.IfUnmodifiedSince, out nullable1))
                {
                    throw new InvalidHeaderProtocolException("If-Unmodified-Since", condHeaders.IfUnmodifiedSince);
                }
            }
            else
            {
                if (string.IsNullOrEmpty(condHeaders.IfMatch))
                {
                    outputCondition = null;
                    return(false);
                }
                if (!string.IsNullOrEmpty(condHeaders.IfModifiedSince) || !string.IsNullOrEmpty(condHeaders.IfNoneMatch))
                {
                    throw new MultipleConditionHeaderProtocolException();
                }
                if (Comparison.StringContains(condHeaders.IfMatch, ","))
                {
                    throw new MultipleConditionHeaderProtocolException();
                }
            }
            ConditionInformation conditionInformation = new ConditionInformation()
            {
                ConditionFailStatusCode = HttpStatusCode.PreconditionFailed,
                ResourceExistsCondition = new ResourceExistenceCondition?(ResourceExistenceCondition.MustExist)
            };

            if (!Comparison.StringEqualsIgnoreCase(condHeaders.IfMatch, "*"))
            {
                try
                {
                    lastModifiedTimeFromETag = BasicHttpProcessor.GetLastModifiedTimeFromETag(condHeaders.IfMatch);
                }
                catch (InvalidHeaderProtocolException invalidHeaderProtocolException1)
                {
                    InvalidHeaderProtocolException invalidHeaderProtocolException = invalidHeaderProtocolException1;
                    if (!VersioningHelper.IsPreSeptember09OrInvalidVersion(requestVersion))
                    {
                        if (operationType == OperationTypeForConditionParsing.CopyOperation)
                        {
                            nullable = new bool?(false);
                        }
                        else
                        {
                            nullable = null;
                        }
                        throw new UnrecognizedIfMatchConditionException(nullable, invalidHeaderProtocolException);
                    }
                    throw;
                }
                if (!VersioningHelper.IsPreSeptember09OrInvalidVersion(requestVersion))
                {
                    conditionInformation.IfMatch = new DateTime[] { lastModifiedTimeFromETag };
                }
                else
                {
                    conditionInformation.IfNotModifiedSince      = new DateTime?(lastModifiedTimeFromETag);
                    conditionInformation.ResourceExistsCondition = new ResourceExistenceCondition?(ResourceExistenceCondition.MayExist);
                }
                if (nullable1.HasValue && !HttpUtilities.DateTimesEqualsUpToSeconds(nullable1.Value, lastModifiedTimeFromETag))
                {
                    outputCondition = null;
                    return(false);
                }
            }
            else
            {
                if (operationType == OperationTypeForConditionParsing.ReadOperation)
                {
                    outputCondition = null;
                    return(false);
                }
                if (nullable1.HasValue)
                {
                    conditionInformation.IfNotModifiedSince = new DateTime?((nullable1.Value < DateTime.MaxValue.AddSeconds(-1) ? nullable1.Value.AddSeconds(1) : nullable1.Value));
                }
            }
            outputCondition = conditionInformation;
            return(true);
        }