diff options
author | Chris Ross <Tratcher@Outlook.com> | 2019-08-24 22:03:03 +0300 |
---|---|---|
committer | Matt Mitchell <mmitche@microsoft.com> | 2019-08-24 22:03:03 +0300 |
commit | 66de493473521e173fa15ca557f5f97601cedb23 (patch) | |
tree | 879daef7c261acadde73d091bbb5e8b895425f90 | |
parent | e9b050735c950ac7bbbd567558f316722005f28a (diff) |
Mark bytes as consumed #13372 (#13394)v3.0.0-preview9.19424.4
-rw-r--r-- | src/Http/WebUtilities/src/FormPipeReader.cs | 2 | ||||
-rw-r--r-- | src/Http/WebUtilities/test/FormPipeReaderTests.cs | 26 |
2 files changed, 28 insertions, 0 deletions
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(); @@ -298,6 +305,23 @@ namespace Microsoft.AspNetCore.WebUtilities } [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() { var readOnlySequence = ReadOnlySequenceFactory.SingleSegmentFactory.CreateWithContent(Encoding.UTF8.GetBytes("foo=bar&baz=boo&t=")); @@ -411,6 +435,7 @@ namespace Microsoft.AspNetCore.WebUtilities }; formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true); + Assert.True(readOnlySequence.IsEmpty); IDictionary<string, StringValues> 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<string, StringValues> values = accumulator.GetResults(); Assert.Contains("fo", values); |