From 66de493473521e173fa15ca557f5f97601cedb23 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Sat, 24 Aug 2019 12:03:03 -0700 Subject: [PATCH] Mark bytes as consumed #13372 (#13394) --- src/Http/WebUtilities/src/FormPipeReader.cs | 2 ++ .../WebUtilities/test/FormPipeReaderTests.cs | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/Http/WebUtilities/src/FormPipeReader.cs b/src/Http/WebUtilities/src/FormPipeReader.cs index e82a0bf9c4..b0a7d4684c 100644 --- a/src/Http/WebUtilities/src/FormPipeReader.cs +++ b/src/Http/WebUtilities/src/FormPipeReader.cs @@ -252,6 +252,8 @@ namespace Microsoft.AspNetCore.WebUtilities { ParseFormValuesFast(keyValuePair.FirstSpan, ref accumulator, isFinalBlock: true, out var segmentConsumed); Debug.Assert(segmentConsumed == keyValuePair.FirstSpan.Length); + consumedBytes = sequenceReader.Consumed; + consumed = sequenceReader.Position; continue; } diff --git a/src/Http/WebUtilities/test/FormPipeReaderTests.cs b/src/Http/WebUtilities/test/FormPipeReaderTests.cs index 6c6a6a42bc..58d3af12d5 100644 --- a/src/Http/WebUtilities/test/FormPipeReaderTests.cs +++ b/src/Http/WebUtilities/test/FormPipeReaderTests.cs @@ -184,6 +184,7 @@ namespace Microsoft.AspNetCore.WebUtilities var formReader = new FormPipeReader(null, encoding); formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true); + Assert.True(readOnlySequence.IsEmpty); Assert.Equal(2, accumulator.KeyCount); var dict = accumulator.GetResults(); @@ -201,6 +202,7 @@ namespace Microsoft.AspNetCore.WebUtilities var formReader = new FormPipeReader(null, encoding); formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true); + Assert.True(readOnlySequence.IsEmpty); Assert.Equal(3, accumulator.KeyCount); var dict = accumulator.GetResults(); @@ -219,6 +221,7 @@ namespace Microsoft.AspNetCore.WebUtilities var formReader = new FormPipeReader(null, encoding); formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true); + Assert.True(readOnlySequence.IsEmpty); Assert.Equal(3, accumulator.KeyCount); var dict = accumulator.GetResults(); @@ -237,6 +240,7 @@ namespace Microsoft.AspNetCore.WebUtilities var formReader = new FormPipeReader(null, encoding); formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true); + Assert.True(readOnlySequence.IsEmpty); Assert.Equal(2, accumulator.KeyCount); var dict = accumulator.GetResults(); @@ -254,6 +258,7 @@ namespace Microsoft.AspNetCore.WebUtilities var formReader = new FormPipeReader(null, encoding); formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true); + Assert.True(readOnlySequence.IsEmpty); Assert.Equal(3, accumulator.KeyCount); var dict = accumulator.GetResults(); @@ -272,6 +277,7 @@ namespace Microsoft.AspNetCore.WebUtilities var formReader = new FormPipeReader(null, encoding); formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true); + Assert.True(readOnlySequence.IsEmpty); Assert.Equal(3, accumulator.KeyCount); var dict = accumulator.GetResults(); @@ -290,6 +296,7 @@ namespace Microsoft.AspNetCore.WebUtilities var formReader = new FormPipeReader(null, encoding); formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true); + Assert.True(readOnlySequence.IsEmpty); Assert.Equal(2, accumulator.KeyCount); var dict = accumulator.GetResults(); @@ -297,6 +304,23 @@ namespace Microsoft.AspNetCore.WebUtilities Assert.Equal("wow", dict["\"%-.<>\\^_`{|}"]); } + [Fact] + public void TryParseFormValues_MultiSegmentFastPathWorks() + { + var readOnlySequence = ReadOnlySequenceFactory.CreateSegments(Encoding.UTF8.GetBytes("foo=bar&"), Encoding.UTF8.GetBytes("baz=boo")); + + KeyValueAccumulator accumulator = default; + + var formReader = new FormPipeReader(null); + formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true); + Assert.True(readOnlySequence.IsEmpty); + + Assert.Equal(2, accumulator.KeyCount); + var dict = accumulator.GetResults(); + Assert.Equal("bar", dict["foo"]); + Assert.Equal("boo", dict["baz"]); + } + [Fact] public void TryParseFormValues_ExceedKeyLengthThrows() { @@ -411,6 +435,7 @@ namespace Microsoft.AspNetCore.WebUtilities }; formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true); + Assert.True(readOnlySequence.IsEmpty); IDictionary values = accumulator.GetResults(); Assert.Contains("fo", values); @@ -431,6 +456,7 @@ namespace Microsoft.AspNetCore.WebUtilities }; formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true); + Assert.True(readOnlySequence.IsEmpty); IDictionary values = accumulator.GetResults(); Assert.Contains("fo", values);