private static bool TryReadQuality(StringSegment input, StringWithQualityHeaderValue result, ref int index) { var current = index; // See if we have a quality value by looking for "q" if ((current == input.Length) || ((input[current] != 'q') && (input[current] != 'Q'))) { return(false); } current++; // skip 'q' identifier current = current + HttpRuleParser.GetWhitespaceLength(input, current); // If we found "q" it must be followed by "=" if ((current == input.Length) || (input[current] != '=')) { return(false); } current++; // skip '=' separator current = current + HttpRuleParser.GetWhitespaceLength(input, current); if (current == input.Length) { return(false); } if (!HeaderUtilities.TryParseQualityDouble(input, current, out var quality, out var qualityLength)) { return(false); } result._quality = quality; current = current + qualityLength; current = current + HttpRuleParser.GetWhitespaceLength(input, current); index = current; return(true); }
private static int GetStringWithQualityLength(StringSegment input, int startIndex, out StringWithQualityHeaderValue parsedValue) { Contract.Requires(startIndex >= 0); parsedValue = null; if (StringSegment.IsNullOrEmpty(input) || (startIndex >= input.Length)) { return(0); } // Parse the value string: <value> in '<value>; q=<quality>' var valueLength = HttpRuleParser.GetTokenLength(input, startIndex); if (valueLength == 0) { return(0); } StringWithQualityHeaderValue result = new StringWithQualityHeaderValue(); result._value = input.Subsegment(startIndex, valueLength); var current = startIndex + valueLength; current = current + HttpRuleParser.GetWhitespaceLength(input, current); if ((current == input.Length) || (input[current] != ';')) { parsedValue = result; return(current - startIndex); // we have a valid token, but no quality. } current++; // skip ';' separator current = current + HttpRuleParser.GetWhitespaceLength(input, current); // If we found a ';' separator, it must be followed by a quality information if (!TryReadQuality(input, result, ref current)) { return(0); } parsedValue = result; return(current - startIndex); }
public static bool TryParse(StringSegment input, out StringWithQualityHeaderValue parsedValue) { var index = 0; return(SingleValueParser.TryParseValue(input, ref index, out parsedValue)); }