Skip to content
This repository was archived by the owner on Dec 18, 2018. It is now read-only.

Commit c4d2b74

Browse files
committed
Use pooled array for header names
1 parent 40dec6f commit c4d2b74

File tree

3 files changed

+38
-23
lines changed

3 files changed

+38
-23
lines changed

src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ public async Task RequestProcessingAsync()
188188
}
189189
}
190190

191-
while (!terminated && !_requestProcessingStopping && !TakeMessageHeaders(SocketInput, _requestHeaders))
191+
while (!terminated && !_requestProcessingStopping && !TakeMessageHeaders(SocketInput, _requestHeaders, Memory2))
192192
{
193193
terminated = SocketInput.RemoteIntakeFin;
194194
if (!terminated)
@@ -697,12 +697,7 @@ private bool TakeStartLine(SocketInput input)
697697
}
698698
}
699699

700-
static string GetString(ArraySegment<byte> range, int startIndex, int endIndex)
701-
{
702-
return Encoding.UTF8.GetString(range.Array, range.Offset + startIndex, endIndex - startIndex);
703-
}
704-
705-
public static bool TakeMessageHeaders(SocketInput input, FrameRequestHeaders requestHeaders)
700+
public static bool TakeMessageHeaders(SocketInput input, FrameRequestHeaders requestHeaders, MemoryPool2 memorypool)
706701
{
707702
var scan = input.ConsumingStart();
708703
var consumed = scan;
@@ -762,6 +757,7 @@ public static bool TakeMessageHeaders(SocketInput input, FrameRequestHeaders req
762757
scan = beginValue;
763758

764759
var wrapping = false;
760+
765761
while (!scan.IsEnd)
766762
{
767763
if (scan.Seek('\r') == -1)
@@ -792,16 +788,24 @@ public static bool TakeMessageHeaders(SocketInput input, FrameRequestHeaders req
792788
continue;
793789
}
794790

795-
var name = beginName.GetArraySegment(endName);
796-
var value = beginValue.GetString(endValue);
797-
if (wrapping)
791+
var block = memorypool.Lease(MemoryPool2.DefaultBlockLength);
792+
try
798793
{
799-
value = value.Replace("\r\n", " ");
800-
}
794+
var name = beginName.GetArraySegment(endName, block.Data);
795+
var value = beginValue.GetString(endValue);
796+
if (wrapping)
797+
{
798+
value = value.Replace("\r\n", " ");
799+
}
801800

802-
consumed = scan;
803-
requestHeaders.Append(name.Array, name.Offset, name.Count, value);
804-
break;
801+
consumed = scan;
802+
requestHeaders.Append(name.Array, name.Offset, name.Count, value);
803+
break;
804+
}
805+
finally
806+
{
807+
memorypool.Return(block);
808+
}
805809
}
806810
}
807811
return false;

src/Microsoft.AspNet.Server.Kestrel/Infrastructure/MemoryPoolIterator2.cs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -566,7 +566,7 @@ public string GetString(MemoryPoolIterator2 end)
566566
}
567567
}
568568

569-
public ArraySegment<byte> GetArraySegment(MemoryPoolIterator2 end)
569+
public ArraySegment<byte> GetArraySegment(MemoryPoolIterator2 end, ArraySegment<byte> scratchBuffer)
570570
{
571571
if (IsDefault || end.IsDefault)
572572
{
@@ -578,9 +578,18 @@ public ArraySegment<byte> GetArraySegment(MemoryPoolIterator2 end)
578578
}
579579

580580
var length = GetLength(end);
581-
var array = new byte[length];
582-
CopyTo(array, 0, length, out length);
583-
return new ArraySegment<byte>(array, 0, length);
581+
582+
if (length < scratchBuffer.Count)
583+
{
584+
CopyTo(scratchBuffer.Array, scratchBuffer.Offset, length, out length);
585+
return new ArraySegment<byte>(scratchBuffer.Array, scratchBuffer.Offset, length);
586+
}
587+
else
588+
{
589+
var array = new byte[length];
590+
CopyTo(array, 0, length, out length);
591+
return new ArraySegment<byte>(array, 0, length);
592+
}
584593
}
585594

586595
public MemoryPoolIterator2 CopyTo(byte[] array, int offset, int count, out int actual)

test/Microsoft.AspNet.Server.KestrelTests/FrameTests.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,13 @@ public void EmptyHeaderValuesCanBeParsed(string rawHeaders, int numHeaders)
5656
Buffer.BlockCopy(headerArray, 0, inputBuffer.Data.Array, inputBuffer.Data.Offset, headerArray.Length);
5757
socketInput.IncomingComplete(headerArray.Length, null);
5858

59-
var success = Frame.TakeMessageHeaders(socketInput, headerCollection);
60-
61-
Assert.True(success);
62-
Assert.Equal(numHeaders, headerCollection.Count());
59+
using (var memorypool = new MemoryPool2())
60+
{
61+
var success = Frame.TakeMessageHeaders(socketInput, headerCollection, memorypool);
6362

63+
Assert.True(success);
64+
Assert.Equal(numHeaders, headerCollection.Count());
65+
}
6466
// Assert TakeMessageHeaders consumed all the input
6567
var scan = socketInput.ConsumingStart();
6668
Assert.True(scan.IsEnd);

0 commit comments

Comments
 (0)