public IDictionary<string, object> ParseETag(EntityTagHeaderValue etagHeaderValue)
        {
            if (etagHeaderValue == null)
            {
                throw Error.ArgumentNull("etagHeaderValue");
            }

            string tag = etagHeaderValue.Tag.Trim('\"');

            // split etag
            string[] rawValues = tag.Split(Separator);
            IDictionary<string, object> properties = new Dictionary<string, object>();
            for (int index = 0; index < rawValues.Length; index++)
            {
                string rawValue = rawValues[index];

                // base64 decode
                byte[] bytes = Convert.FromBase64String(rawValue);
                string valueString = Encoding.UTF8.GetString(bytes);
                object obj = ODataUriUtils.ConvertFromUriLiteral(valueString, ODataVersion.V4);
                if (obj is ODataNullValue)
                {
                    obj = null;
                }
                properties.Add(index.ToString(CultureInfo.InvariantCulture), obj);
            }

            return properties;
        }
        public StaticFileContext(HttpContext context, StaticFileOptions options, PathString matchUrl, ILogger logger)
        {
            _context = context;
            _options = options;
            _matchUrl = matchUrl;
            _request = context.Request;
            _response = context.Response;
            _logger = logger;
            _requestHeaders = _request.GetTypedHeaders();
            _responseHeaders = _response.GetTypedHeaders();

            _method = null;
            _isGet = false;
            _isHead = false;
            _subPath = PathString.Empty;
            _contentType = null;
            _fileInfo = null;
            _length = 0;
            _lastModified = new DateTimeOffset();
            _etag = null;
            _ifMatchState = PreconditionState.Unspecified;
            _ifNoneMatchState = PreconditionState.Unspecified;
            _ifModifiedSinceState = PreconditionState.Unspecified;
            _ifUnmodifiedSinceState = PreconditionState.Unspecified;
            _ranges = null;
        }
        public RangeConditionHeaderValue(EntityTagHeaderValue entityTag)
        {
            if (entityTag == null)
            {
                throw new ArgumentNullException(nameof(entityTag));
            }

            _entityTag = entityTag;
        }
        public void ToString_UseDifferentETags_AllSerializedCorrectly()
        {
            var etag = new EntityTagHeaderValue("\"e tag\"");
            Assert.Equal("\"e tag\"", etag.ToString());

            etag = new EntityTagHeaderValue("\"e tag\"", true);
            Assert.Equal("W/\"e tag\"", etag.ToString());

            etag = new EntityTagHeaderValue("\"\"", false);
            Assert.Equal("\"\"", etag.ToString());
        }
        public void GetHashCode_UseSameAndDifferentETags_SameOrDifferentHashCodes()
        {
            var etag1 = new EntityTagHeaderValue("\"tag\"");
            var etag2 = new EntityTagHeaderValue("\"TAG\"");
            var etag3 = new EntityTagHeaderValue("\"tag\"", true);
            var etag4 = new EntityTagHeaderValue("\"tag1\"");
            var etag5 = new EntityTagHeaderValue("\"tag\"");
            var etag6 = EntityTagHeaderValue.Any;

            Assert.NotEqual(etag1.GetHashCode(), etag2.GetHashCode());
            Assert.NotEqual(etag1.GetHashCode(), etag3.GetHashCode());
            Assert.NotEqual(etag1.GetHashCode(), etag4.GetHashCode());
            Assert.NotEqual(etag1.GetHashCode(), etag6.GetHashCode());
            Assert.Equal(etag1.GetHashCode(), etag5.GetHashCode());
        }
        public void Equals_UseSameAndDifferentETags_EqualOrNotEqualNoExceptions()
        {
            var etag1 = new EntityTagHeaderValue("\"tag\"");
            var etag2 = new EntityTagHeaderValue("\"TAG\"");
            var etag3 = new EntityTagHeaderValue("\"tag\"", true);
            var etag4 = new EntityTagHeaderValue("\"tag1\"");
            var etag5 = new EntityTagHeaderValue("\"tag\"");
            var etag6 = EntityTagHeaderValue.Any;

            Assert.False(etag1.Equals(etag2), "Different casing.");
            Assert.False(etag2.Equals(etag1), "Different casing.");
            Assert.False(etag1.Equals(null), "tag vs. <null>.");
            Assert.False(etag1.Equals(etag3), "strong vs. weak.");
            Assert.False(etag3.Equals(etag1), "weak vs. strong.");
            Assert.False(etag1.Equals(etag4), "tag vs. tag1.");
            Assert.False(etag1.Equals(etag6), "tag vs. *.");
            Assert.True(etag1.Equals(etag5), "tag vs. tag..");
        }
        internal static int GetEntityTagLength(string input, int startIndex, out EntityTagHeaderValue parsedValue)
        {
            Contract.Requires(startIndex >= 0);

            parsedValue = null;

            if (string.IsNullOrEmpty(input) || (startIndex >= input.Length))
            {
                return 0;
            }

            // Caller must remove leading whitespaces. If not, we'll return 0.
            var isWeak = false;
            var current = startIndex;

            var firstChar = input[startIndex];
            if (firstChar == '*')
            {
                // We have '*' value, indicating "any" ETag.
                parsedValue = Any;
                current++;
            }
            else
            {
                // The RFC defines 'W/' as prefix, but we'll be flexible and also accept lower-case 'w'.
                if ((firstChar == 'W') || (firstChar == 'w'))
                {
                    current++;
                    // We need at least 3 more chars: the '/' character followed by two quotes.
                    if ((current + 2 >= input.Length) || (input[current] != '/'))
                    {
                        return 0;
                    }
                    isWeak = true;
                    current++; // we have a weak-entity tag.
                    current = current + HttpRuleParser.GetWhitespaceLength(input, current);
                }

                var tagStartIndex = current;
                var tagLength = 0;
                if (HttpRuleParser.GetQuotedStringLength(input, current, out tagLength) != HttpParseResult.Parsed)
                {
                    return 0;
                }

                parsedValue = new EntityTagHeaderValue();
                if (tagLength == input.Length)
                {
                    // Most of the time we'll have strong ETags without leading/trailing whitespaces.
                    Contract.Assert(startIndex == 0);
                    Contract.Assert(!isWeak);
                    parsedValue._tag = input;
                    parsedValue._isWeak = false;
                }
                else
                {
                    parsedValue._tag = input.Substring(tagStartIndex, tagLength);
                    parsedValue._isWeak = isWeak;
                }

                current = current + tagLength;
            }
            current = current + HttpRuleParser.GetWhitespaceLength(input, current);

            return current - startIndex;
        }
 public static bool TryParse(string input, out EntityTagHeaderValue parsedValue)
 {
     var index = 0;
     return SingleValueParser.TryParseValue(input, ref index, out parsedValue);
 }
 public void Ctor_ETagValidFormatAndIsWeak_SuccessfullyCreated()
 {
     var etag = new EntityTagHeaderValue("\"e tag\"", true);
     Assert.Equal("\"e tag\"", etag.Tag);
     Assert.True(etag.IsWeak, "IsWeak");
 }
 private void CheckValidTryParse(string input, EntityTagHeaderValue expectedResult)
 {
     EntityTagHeaderValue result = null;
     Assert.True(EntityTagHeaderValue.TryParse(input, out result));
     Assert.Equal(expectedResult, result);
 }
 private void CheckValidParse(string input, EntityTagHeaderValue expectedResult)
 {
     var result = EntityTagHeaderValue.Parse(input);
     Assert.Equal(expectedResult, result);
 }
        public bool LookupFileInfo()
        {
            _fileInfo = _options.FileProvider.GetFileInfo(_subPath.Value);
            if (_fileInfo.Exists)
            {
                _length = _fileInfo.Length;

                DateTimeOffset last = _fileInfo.LastModified;
                // Truncate to the second.
                _lastModified = new DateTimeOffset(last.Year, last.Month, last.Day, last.Hour, last.Minute, last.Second, last.Offset);

                long etagHash = _lastModified.ToFileTime() ^ _length;
                _etag = new EntityTagHeaderValue('\"' + Convert.ToString(etagHash, 16) + '\"');
            }
            return _fileInfo.Exists;
        }
Example #13
0
            public void ConvertsEtag(ETag input, EntityTagHeaderValue expectedOutput)
            {
                var result = DnxExtensions.ToETagHeaderValue(input);

                Assert.Equal(expectedOutput.IsWeak, result.IsWeak);
                Assert.Equal(expectedOutput.Tag, result.Tag);
            }
Example #14
0
        private static int GetRangeConditionLength(StringSegment input, int startIndex, out RangeConditionHeaderValue?parsedValue)
        {
            Contract.Requires(startIndex >= 0);

            parsedValue = null;

            // Make sure we have at least 2 characters
            if (StringSegment.IsNullOrEmpty(input) || (startIndex + 1 >= input.Length))
            {
                return(0);
            }

            var current = startIndex;

            // Caller must remove leading whitespaces.
            DateTimeOffset       date      = DateTimeOffset.MinValue;
            EntityTagHeaderValue?entityTag = null;

            // Entity tags are quoted strings optionally preceded by "W/". By looking at the first two character we
            // can determine whether the string is en entity tag or a date.
            var firstChar  = input[current];
            var secondChar = input[current + 1];

            if ((firstChar == '\"') || (((firstChar == 'w') || (firstChar == 'W')) && (secondChar == '/')))
            {
                // trailing whitespaces are removed by GetEntityTagLength()
                var entityTagLength = EntityTagHeaderValue.GetEntityTagLength(input, current, out entityTag);

                if (entityTagLength == 0)
                {
                    return(0);
                }

                current = current + entityTagLength;

                // RangeConditionHeaderValue only allows 1 value. There must be no delimiter/other chars after an
                // entity tag.
                if (current != input.Length)
                {
                    return(0);
                }
            }
            else
            {
                if (!HttpRuleParser.TryStringToDate(input.Subsegment(current), out date))
                {
                    return(0);
                }

                // If we got a valid date, then the parser consumed the whole string (incl. trailing whitespaces).
                current = input.Length;
            }

            parsedValue = new RangeConditionHeaderValue();
            if (entityTag == null)
            {
                parsedValue._lastModified = date;
            }
            else
            {
                parsedValue._entityTag = entityTag;
            }

            return(current - startIndex);
        }
 private void CheckInvalidParse(string input)
 {
     Assert.Throws <FormatException>(() => EntityTagHeaderValue.Parse(input));
 }
        private void CheckValidParse(string input, EntityTagHeaderValue expectedResult)
        {
            var result = EntityTagHeaderValue.Parse(input);

            Assert.Equal(expectedResult, result);
        }