private int ParseHeader(ReadOnlySpan <byte> data)
        {
            if (data.Length < 2)
            {
                return(0);
            }

            _headers ??= new HttpHeaderCollection();

            if (data.ReadShort() == 0x0A0D)
            {
                State = HttpRequestMessageState.HeadersParsed;
                return(2);
            }

            var offset = data.IndexOf(new[] { ByteCr, ByteLf });

            if (offset == -1)
            {
                return(0);
            }

            var nameLength = data.IndexOf((byte)':');

            if (nameLength == -1)
            {
                return(0);
            }

            var name = data.Slice(0, nameLength);

            var valueOffset = nameLength + 1;

            if (data[valueOffset] == ByteSpace)
            {
                valueOffset++;
            }

            var value = data.Slice(valueOffset, offset - valueOffset);

            _headers.Add(name.GetAsciiString(), value.GetAsciiString());

            return(offset + 2);
        }
        internal bool ParseStartLineAndHeaders(ReadOnlySpan <byte> data, out int consumed)
        {
            consumed = 0;

            while (State != HttpRequestMessageState.HeadersParsed)
            {
                var currentConsumed = State switch
                {
                    HttpRequestMessageState.ParsingMethod => ParseMethod(data),
                    HttpRequestMessageState.ParsingRequestUri => ParseRequestUri(data),
                    HttpRequestMessageState.ParsingVersion => ParseVersion(data),
                    HttpRequestMessageState.ParsingHeader => ParseHeader(data),

                    _ => throw new InvalidOperationException(),
                };

                if (currentConsumed == 0)
                {
                    return(false);
                }

                if (State < HttpRequestMessageState.ParsingHeader)
                {
                    State++;
                }

                consumed += currentConsumed;
                data      = data.Slice(currentConsumed);
            }

            Debug.Assert(_headers != null);

            if (_headers.TryGetValue("Expect", out var expect) && expect == "100-continue")
            {
                State = HttpRequestMessageState.HandlingExpect100Continue;
            }
            else
            {
                State = HttpRequestMessageState.ReadingBody;
            }

            return(true);
        }