Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }