Mark bytes as consumed #13372 (#13394)

This commit is contained in:
Chris Ross 2019-08-24 12:03:03 -07:00 committed by Matt Mitchell
parent e9b050735c
commit 66de493473
2 changed files with 28 additions and 0 deletions

View File

@ -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;
}

View File

@ -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<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);