Parser clean up (#1419)
- Remove stackalloc - Remove extra Move in ParseRequestLine
This commit is contained in:
parent
f2a00da811
commit
ca31627a5e
|
|
@ -32,32 +32,21 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Internal.Http
|
||||||
examined = buffer.End;
|
examined = buffer.End;
|
||||||
|
|
||||||
var start = buffer.Start;
|
var start = buffer.Start;
|
||||||
ReadCursor end;
|
if (ReadCursorOperations.Seek(start, buffer.End, out var end, ByteLF) == -1)
|
||||||
if (ReadCursorOperations.Seek(start, buffer.End, out end, ByteLF) == -1)
|
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const int stackAllocLimit = 512;
|
|
||||||
|
|
||||||
// Move 1 byte past the \n
|
// Move 1 byte past the \n
|
||||||
end = buffer.Move(end, 1);
|
end = buffer.Move(end, 1);
|
||||||
var startLineBuffer = buffer.Slice(start, end);
|
var startLineBuffer = buffer.Slice(start, end);
|
||||||
|
|
||||||
Span<byte> span;
|
Span<byte> span;
|
||||||
|
|
||||||
if (startLineBuffer.IsSingleSpan)
|
if (startLineBuffer.IsSingleSpan)
|
||||||
{
|
{
|
||||||
// No copies, directly use the one and only span
|
// No copies, directly use the one and only span
|
||||||
span = startLineBuffer.First.Span;
|
span = startLineBuffer.First.Span;
|
||||||
}
|
}
|
||||||
else if (startLineBuffer.Length < stackAllocLimit)
|
|
||||||
{
|
|
||||||
// Multiple buffers and < stackAllocLimit, copy into a stack buffer
|
|
||||||
byte* stackBuffer = stackalloc byte[startLineBuffer.Length];
|
|
||||||
span = new Span<byte>(stackBuffer, startLineBuffer.Length);
|
|
||||||
startLineBuffer.CopyTo(span);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// We're not a single span here but we can use pooled arrays to avoid allocations in the rare case
|
// We're not a single span here but we can use pooled arrays to avoid allocations in the rare case
|
||||||
|
|
@ -242,7 +231,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Internal.Http
|
||||||
var query = span.Slice(queryStart, queryEnd - queryStart);
|
var query = span.Slice(queryStart, queryEnd - queryStart);
|
||||||
|
|
||||||
handler.OnStartLine(method, httpVersion, targetBuffer, pathBuffer, query, customMethod);
|
handler.OnStartLine(method, httpVersion, targetBuffer, pathBuffer, query, customMethod);
|
||||||
consumed = buffer.Move(start, i);
|
|
||||||
|
consumed = end;
|
||||||
examined = consumed;
|
examined = consumed;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -297,8 +287,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Internal.Http
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const int stackAllocLimit = 512;
|
|
||||||
|
|
||||||
if (lineEnd != bufferEnd)
|
if (lineEnd != bufferEnd)
|
||||||
{
|
{
|
||||||
lineEnd = buffer.Move(lineEnd, 1);
|
lineEnd = buffer.Move(lineEnd, 1);
|
||||||
|
|
@ -312,13 +300,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Internal.Http
|
||||||
// No copies, directly use the one and only span
|
// No copies, directly use the one and only span
|
||||||
span = headerBuffer.First.Span;
|
span = headerBuffer.First.Span;
|
||||||
}
|
}
|
||||||
else if (headerBuffer.Length < stackAllocLimit)
|
|
||||||
{
|
|
||||||
// Multiple buffers and < stackAllocLimit, copy into a stack buffer
|
|
||||||
byte* stackBuffer = stackalloc byte[headerBuffer.Length];
|
|
||||||
span = new Span<byte>(stackBuffer, headerBuffer.Length);
|
|
||||||
headerBuffer.CopyTo(span);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// We're not a single span here but we can use pooled arrays to avoid allocations in the rare case
|
// We're not a single span here but we can use pooled arrays to avoid allocations in the rare case
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue