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); }