public bool TryParseAndAdd(string header) { if (header == null) { throw new ArgumentNullException(nameof(header)); } var separatorIndex = header.IndexOf(':', 0); if (separatorIndex == -1 || separatorIndex == 0) { return(false); // header is invalid } var headerStartIndex = 0; var headerLength = separatorIndex - headerStartIndex; HeadersHelper.TrimInPlace(header, ref headerStartIndex, ref headerLength); var valueStartIndex = separatorIndex + 1; var valueLength = header.Length - valueStartIndex; HeadersHelper.TrimInPlace(header, ref valueStartIndex, ref valueLength); if (headerLength == 0 || valueLength == 0) { return(false); // header name or value is empty } var headerName = header.Substring(headerStartIndex, headerLength); var knownHeaderValue = GetKnownHeaderValue(headerName); if (knownHeaderValue >= 0) { var value = header.Substring(valueStartIndex, valueLength); if ((GetFlags(knownHeaderValue) & HeaderFlags.Singleton) == HeaderFlags.Singleton) // it is atomic header, so don't split it { this.Add(FromInt(knownHeaderValue), value); } else { foreach (var headerValue in TrimAndSplit(header, valueStartIndex, valueLength)) { this.Add(headerName, headerValue); } } } else { foreach (var headerValue in TrimAndSplit(header, valueStartIndex, valueLength)) { this.Add(headerName, headerValue); } } return(true); }
private static ValueCollection TrimAndSplit(string valueString, int startIndex, int count) { if (valueString == null) { throw new ArgumentNullException(nameof(valueString)); } if (startIndex < 0 || startIndex >= valueString.Length) { throw new ArgumentOutOfRangeException(nameof(startIndex)); } if (count < 0 || startIndex + count > valueString.Length) { throw new ArgumentOutOfRangeException(nameof(count)); } const char VALUE_SEPARATOR = ','; var values = new ValueCollection(); var valueStartIndex = startIndex; var valueLength = count; var valueSeparatorIndex = valueString.IndexOf(VALUE_SEPARATOR, valueStartIndex, count); while (valueSeparatorIndex >= 0) { valueLength = valueSeparatorIndex - valueStartIndex; HeadersHelper.TrimInPlace(valueString, ref valueStartIndex, ref valueLength); if (valueLength > 0) { values += new ValueCollection(valueString.Substring(valueStartIndex, valueLength)); } valueStartIndex = valueSeparatorIndex + 1; valueLength = startIndex + count - valueStartIndex; valueSeparatorIndex = valueString.IndexOf(VALUE_SEPARATOR, valueStartIndex, valueLength); } HeadersHelper.TrimInPlace(valueString, ref valueStartIndex, ref valueLength); if (valueLength > 0) { values += new ValueCollection(valueString.Substring(valueStartIndex, valueLength)); } return(values); }