internal static int GetTransferCodingLength(string input, int startIndex,
Func <TransferCodingHeaderValue> transferCodingCreator, out TransferCodingHeaderValue?parsedValue)
{
Debug.Assert(transferCodingCreator != null);
Debug.Assert(startIndex >= 0);
parsedValue = null;
if (string.IsNullOrEmpty(input) || (startIndex >= input.Length))
{
return(0);
}
// Caller must remove leading whitespace. If not, we'll return 0.
int valueLength = HttpRuleParser.GetTokenLength(input, startIndex);
if (valueLength == 0)
{
return(0);
}
string value = input.Substring(startIndex, valueLength);
int current = startIndex + valueLength;
current = current + HttpRuleParser.GetWhitespaceLength(input, current);
TransferCodingHeaderValue transferCodingHeader;
// If we're not done and we have a parameter delimiter, then we have a list of parameters.
if ((current < input.Length) && (input[current] == ';'))
{
transferCodingHeader = transferCodingCreator();
transferCodingHeader._value = value;
current++; // skip delimiter.
int parameterLength = NameValueHeaderValue.GetNameValueListLength(input, current, ';',
(UnvalidatedObjectCollection <NameValueHeaderValue>)transferCodingHeader.Parameters);
if (parameterLength == 0)
{
return(0);
}
parsedValue = transferCodingHeader;
return(current + parameterLength - startIndex);
}
// We have a transfer coding without parameters.
transferCodingHeader = transferCodingCreator();
transferCodingHeader._value = value;
parsedValue = transferCodingHeader;
return(current - startIndex);
}