From 1ca83fb8f349f7da4ee70923c157790947694301 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 23 Aug 2019 16:27:31 -0700 Subject: [PATCH] Mark bytes as consumed #13372 --- 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 e82a0bf9c4e3..b0a7d4684c46 100644 --- a/src/Http/WebUtilities/src/FormPipeReader.cs +++ b/src/Http/WebUtilities/src/FormPipeReader.cs @@ -252,6 +252,8 @@ private void ParseValuesSlow( { 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 6c6a6a42bc21..58d3af12d5eb 100644 --- a/src/Http/WebUtilities/test/FormPipeReaderTests.cs +++ b/src/Http/WebUtilities/test/FormPipeReaderTests.cs @@ -184,6 +184,7 @@ public void TryParseFormValues_SingleSegmentWorks(Encoding encoding) 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 @@ public void TryParseFormValues_Works(Encoding encoding) 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 @@ public void TryParseFormValues_SplitAcrossSegmentsWorks(Encoding encoding) 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 @@ public void TryParseFormValues_MultiSegmentWithArrayPoolAcrossSegmentsWorks(Enco 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 @@ public void TryParseFormValues_MultiSegmentSplitAcrossSegmentsWithPlusesWorks(En 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 @@ public void TryParseFormValues_DecodedPlusesWorks(Encoding encoding) 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 @@ public void TryParseFormValues_SplitAcrossSegmentsThatNeedDecodingWorks(Encoding 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 @@ public void TryParseFormValues_SplitAcrossSegmentsThatNeedDecodingWorks(Encoding 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 @@ public void ParseFormWithIncompleteKeyWhenIsFinalBlockSucceeds(ReadOnlySequence< }; formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true); + Assert.True(readOnlySequence.IsEmpty); IDictionary values = accumulator.GetResults(); Assert.Contains("fo", values); @@ -431,6 +456,7 @@ public void ParseFormWithIncompleteValueWhenIsFinalBlockSucceeds(ReadOnlySequenc }; formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true); + Assert.True(readOnlySequence.IsEmpty); IDictionary values = accumulator.GetResults(); Assert.Contains("fo", values);