public EntityTagHeaderValue(StringSegment tag, bool isWeak) { if (StringSegment.IsNullOrEmpty(tag)) { throw new ArgumentException("An empty string is not allowed.", nameof(tag)); } int length = 0; if (!isWeak && StringSegment.Equals(tag, "*", StringComparison.Ordinal)) { // * is valid, but W/* isn't. _tag = tag; } else if ((ProtoRuleParser.GetQuotedStringLength(tag, 0, out length) != ProtoParseResult.Parsed) || (length != tag.Length)) { // Note that we don't allow 'W/' prefixes for weak ETags in the 'tag' parameter. If the user wants to // add a weak ETag, he can set 'isWeak' to true. throw new FormatException("Invalid ETag name"); } _tag = tag; _isWeak = isWeak; }
internal static int GetValueLength(StringSegment input, int startIndex) { Contract.Requires(input != null); if (startIndex >= input.Length) { return(0); } var valueLength = ProtoRuleParser.GetTokenLength(input, startIndex); if (valueLength == 0) { // A value can either be a token or a quoted string. Check if it is a quoted string. if (ProtoRuleParser.GetQuotedStringLength(input, startIndex, out valueLength) != ProtoParseResult.Parsed) { // We have an invalid value. Reset the name and return. return(0); } } return(valueLength); }
internal static int GetEntityTagLength(StringSegment input, int startIndex, out EntityTagHeaderValue parsedValue) { Contract.Requires(startIndex >= 0); parsedValue = null; if (StringSegment.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 + ProtoRuleParser.GetWhitespaceLength(input, current); } var tagStartIndex = current; var tagLength = 0; if (ProtoRuleParser.GetQuotedStringLength(input, current, out tagLength) != ProtoParseResult.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.Subsegment(tagStartIndex, tagLength); parsedValue._isWeak = isWeak; } current = current + tagLength; } current = current + ProtoRuleParser.GetWhitespaceLength(input, current); return(current - startIndex); }