From 2f905937e1fb540a211a4d334624ac78a8c937da Mon Sep 17 00:00:00 2001 From: Brennan Conroy Date: Fri, 20 Oct 2023 16:32:31 -0700 Subject: [PATCH] Improve path search in Kestrel parsing --- .../Core/src/Internal/Http/HttpParser.cs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/HttpParser.cs b/src/Servers/Kestrel/Core/src/Internal/Http/HttpParser.cs index c5697c05cc47..362a371ce1b8 100644 --- a/src/Servers/Kestrel/Core/src/Internal/Http/HttpParser.cs +++ b/src/Servers/Kestrel/Core/src/Internal/Http/HttpParser.cs @@ -105,18 +105,19 @@ private void ParseRequestLine(TRequestHandler handler, ReadOnlySpan reques offset++; // Find end of path and if path is encoded - for (; (uint)offset < (uint)requestLine.Length; offset++) + var index = requestLine.Slice(offset).IndexOfAny(ByteSpace, ByteQuestionMark, BytePercentage); + if (index >= 0) { - ch = requestLine[offset]; - if (ch == ByteSpace || ch == ByteQuestionMark) - { - // End of path - break; - } - else if (ch == BytePercentage) + if (requestLine[offset + index] == BytePercentage) { pathEncoded = true; + offset += index; + // Found an encoded character, now just search for end of path + index = requestLine.Slice(offset).IndexOfAny(ByteSpace, ByteQuestionMark); } + + offset += index; + ch = requestLine[offset]; } var path = new TargetOffsetPathLength(targetStart, length: offset - targetStart, pathEncoded);