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; }
public void ConvertsEtag(ETag input, EntityTagHeaderValue expectedOutput) { var result = DnxExtensions.ToETagHeaderValue(input); Assert.Equal(expectedOutput.IsWeak, result.IsWeak); Assert.Equal(expectedOutput.Tag, result.Tag); }
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)); }