diff --git a/src/Microsoft.AspNetCore.Server.Kestrel.Core/Internal/Http/HttpParser.cs b/src/Microsoft.AspNetCore.Server.Kestrel.Core/Internal/Http/HttpParser.cs index f5ac574008..9b253fb20a 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel.Core/Internal/Http/HttpParser.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel.Core/Internal/Http/HttpParser.cs @@ -1,7 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Numerics; using System.Runtime.CompilerServices; using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure; using Microsoft.AspNetCore.Server.Kestrel.Internal.System; @@ -379,13 +378,14 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http } // Check for CR in value - var i = valueStart + 1; - if (Contains(headerLine + i, valueEnd - i, ByteCR)) + var valueBuffer = new Span(headerLine + valueStart, valueEnd - valueStart + 1); + if (valueBuffer.IndexOf(ByteCR) >= 0) { RejectRequestHeader(headerLine, length); } // Ignore end whitespace + var lengthChanged = false; for (; valueEnd >= valueStart; valueEnd--) { var ch = headerLine[valueEnd]; @@ -393,50 +393,21 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http { break; } + + lengthChanged = true; + } + + if (lengthChanged) + { + // Length changed + valueBuffer = new Span(headerLine + valueStart, valueEnd - valueStart + 1); } var nameBuffer = new Span(headerLine, nameEnd); - var valueBuffer = new Span(headerLine + valueStart, valueEnd - valueStart + 1); handler.OnHeader(nameBuffer, valueBuffer); } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static unsafe bool Contains(byte* searchSpace, int length, byte value) - { - var i = 0; - if (Vector.IsHardwareAccelerated) - { - // Check Vector lengths - if (length - Vector.Count >= i) - { - var vValue = GetVector(value); - do - { - if (!Vector.Zero.Equals(Vector.Equals(vValue, Unsafe.Read>(searchSpace + i)))) - { - goto found; - } - - i += Vector.Count; - } while (length - Vector.Count >= i); - } - } - - // Check remaining for CR - for (; i <= length; i++) - { - var ch = searchSpace[i]; - if (ch == value) - { - goto found; - } - } - return false; - found: - return true; - } - [MethodImpl(MethodImplOptions.NoInlining)] private static bool TryGetNewLine(ref ReadableBuffer buffer, out ReadCursor found) { @@ -524,14 +495,5 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http public void Reset() { } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector GetVector(byte vectorByte) - { - // Vector .ctor doesn't become an intrinsic due to detection issue - // However this does cause it to become an intrinsic (with additional multiply and reg->reg copy) - // https://github.com/dotnet/coreclr/issues/7459#issuecomment-253965670 - return Vector.AsVectorByte(new Vector(vectorByte * 0x01010101u)); - } } }