Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dotnet/aspnetcore.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Ross <Tratcher@Outlook.com>2019-08-24 22:03:03 +0300
committerMatt Mitchell <mmitche@microsoft.com>2019-08-24 22:03:03 +0300
commit66de493473521e173fa15ca557f5f97601cedb23 (patch)
tree879daef7c261acadde73d091bbb5e8b895425f90
parente9b050735c950ac7bbbd567558f316722005f28a (diff)
Mark bytes as consumed #13372 (#13394)v3.0.0-preview9.19424.4
-rw-r--r--src/Http/WebUtilities/src/FormPipeReader.cs2
-rw-r--r--src/Http/WebUtilities/test/FormPipeReaderTests.cs26
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);