diff --git a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/MemoryPoolIterator2.cs b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/MemoryPoolIterator2.cs index a4ec046e58..8964093d03 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/MemoryPoolIterator2.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/MemoryPoolIterator2.cs @@ -448,6 +448,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Infrastructure else { Buffer.BlockCopy(block.Array, index, array, offset, following); + offset += following; remaining -= following; block = block.Next; index = block.Start; diff --git a/test/Microsoft.AspNet.Server.KestrelTests/MemoryPoolBlock2Tests.cs b/test/Microsoft.AspNet.Server.KestrelTests/MemoryPoolBlock2Tests.cs index 1a8fa0f4e4..db3b03802f 100644 --- a/test/Microsoft.AspNet.Server.KestrelTests/MemoryPoolBlock2Tests.cs +++ b/test/Microsoft.AspNet.Server.KestrelTests/MemoryPoolBlock2Tests.cs @@ -117,6 +117,65 @@ namespace Microsoft.AspNet.Server.KestrelTests } } + [Fact] + public void CopyToCorrectlyTraversesBlocks() + { + using (var pool = new MemoryPool2()) + { + var block1 = pool.Lease(128); + var block2 = block1.Next = pool.Lease(128); + + for (int i = 0; i < 128; i++) + { + block1.Array[block1.End++] = (byte)i; + } + for (int i = 128; i < 256; i++) + { + block2.Array[block2.End++] = (byte)i; + } + + var beginIterator = block1.GetIterator(); + + var array = new byte[256]; + int actual; + var endIterator = beginIterator.CopyTo(array, 0, 256, out actual); + + Assert.Equal(256, actual); + + for (int i = 0; i < 256; i++) + { + Assert.Equal(i, array[i]); + } + + endIterator.CopyTo(array, 0, 256, out actual); + Assert.Equal(0, actual); + } + } + + [Fact] + public void IsEndCorrectlyTraversesBlocks() + { + using (var pool = new MemoryPool2()) + { + var block1 = pool.Lease(128); + var block2 = block1.Next = pool.Lease(128); + var block3 = block2.Next = pool.Lease(128); + var block4 = block3.Next = pool.Lease(128); + + // There is no data in block2 or block4, so IsEnd should be true after 256 bytes are read. + block1.End += 128; + block3.End += 128; + + var iterStart = block1.GetIterator(); + var iterMid = iterStart.Add(128); + var iterEnd = iterMid.Add(128); + + Assert.False(iterStart.IsEnd); + Assert.False(iterMid.IsEnd); + Assert.True(iterEnd.IsEnd); + } + } + private void AssertIterator(MemoryPoolIterator2 iter, MemoryPoolBlock2 block, int index) { Assert.Same(block, iter.Block);