Skip to content

Commit 66de493

Browse files
Tratchermmitche
authored andcommitted
Mark bytes as consumed #13372 (#13394)
1 parent e9b0507 commit 66de493

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

src/Http/WebUtilities/src/FormPipeReader.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,8 @@ private void ParseValuesSlow(
252252
{
253253
ParseFormValuesFast(keyValuePair.FirstSpan, ref accumulator, isFinalBlock: true, out var segmentConsumed);
254254
Debug.Assert(segmentConsumed == keyValuePair.FirstSpan.Length);
255+
consumedBytes = sequenceReader.Consumed;
256+
consumed = sequenceReader.Position;
255257
continue;
256258
}
257259

src/Http/WebUtilities/test/FormPipeReaderTests.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ public void TryParseFormValues_SingleSegmentWorks(Encoding encoding)
184184
var formReader = new FormPipeReader(null, encoding);
185185

186186
formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true);
187+
Assert.True(readOnlySequence.IsEmpty);
187188

188189
Assert.Equal(2, accumulator.KeyCount);
189190
var dict = accumulator.GetResults();
@@ -201,6 +202,7 @@ public void TryParseFormValues_Works(Encoding encoding)
201202

202203
var formReader = new FormPipeReader(null, encoding);
203204
formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true);
205+
Assert.True(readOnlySequence.IsEmpty);
204206

205207
Assert.Equal(3, accumulator.KeyCount);
206208
var dict = accumulator.GetResults();
@@ -219,6 +221,7 @@ public void TryParseFormValues_SplitAcrossSegmentsWorks(Encoding encoding)
219221

220222
var formReader = new FormPipeReader(null, encoding);
221223
formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true);
224+
Assert.True(readOnlySequence.IsEmpty);
222225

223226
Assert.Equal(3, accumulator.KeyCount);
224227
var dict = accumulator.GetResults();
@@ -237,6 +240,7 @@ public void TryParseFormValues_MultiSegmentWithArrayPoolAcrossSegmentsWorks(Enco
237240

238241
var formReader = new FormPipeReader(null, encoding);
239242
formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true);
243+
Assert.True(readOnlySequence.IsEmpty);
240244

241245
Assert.Equal(2, accumulator.KeyCount);
242246
var dict = accumulator.GetResults();
@@ -254,6 +258,7 @@ public void TryParseFormValues_MultiSegmentSplitAcrossSegmentsWithPlusesWorks(En
254258

255259
var formReader = new FormPipeReader(null, encoding);
256260
formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true);
261+
Assert.True(readOnlySequence.IsEmpty);
257262

258263
Assert.Equal(3, accumulator.KeyCount);
259264
var dict = accumulator.GetResults();
@@ -272,6 +277,7 @@ public void TryParseFormValues_DecodedPlusesWorks(Encoding encoding)
272277

273278
var formReader = new FormPipeReader(null, encoding);
274279
formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true);
280+
Assert.True(readOnlySequence.IsEmpty);
275281

276282
Assert.Equal(3, accumulator.KeyCount);
277283
var dict = accumulator.GetResults();
@@ -290,13 +296,31 @@ public void TryParseFormValues_SplitAcrossSegmentsThatNeedDecodingWorks(Encoding
290296

291297
var formReader = new FormPipeReader(null, encoding);
292298
formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true);
299+
Assert.True(readOnlySequence.IsEmpty);
293300

294301
Assert.Equal(2, accumulator.KeyCount);
295302
var dict = accumulator.GetResults();
296303
Assert.Equal("\"%-.<>\\^_`{|}~", dict["\"%-.<>\\^_`{|}~"]);
297304
Assert.Equal("wow", dict["\"%-.<>\\^_`{|}"]);
298305
}
299306

307+
[Fact]
308+
public void TryParseFormValues_MultiSegmentFastPathWorks()
309+
{
310+
var readOnlySequence = ReadOnlySequenceFactory.CreateSegments(Encoding.UTF8.GetBytes("foo=bar&"), Encoding.UTF8.GetBytes("baz=boo"));
311+
312+
KeyValueAccumulator accumulator = default;
313+
314+
var formReader = new FormPipeReader(null);
315+
formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true);
316+
Assert.True(readOnlySequence.IsEmpty);
317+
318+
Assert.Equal(2, accumulator.KeyCount);
319+
var dict = accumulator.GetResults();
320+
Assert.Equal("bar", dict["foo"]);
321+
Assert.Equal("boo", dict["baz"]);
322+
}
323+
300324
[Fact]
301325
public void TryParseFormValues_ExceedKeyLengthThrows()
302326
{
@@ -411,6 +435,7 @@ public void ParseFormWithIncompleteKeyWhenIsFinalBlockSucceeds(ReadOnlySequence<
411435
};
412436

413437
formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true);
438+
Assert.True(readOnlySequence.IsEmpty);
414439

415440
IDictionary<string, StringValues> values = accumulator.GetResults();
416441
Assert.Contains("fo", values);
@@ -431,6 +456,7 @@ public void ParseFormWithIncompleteValueWhenIsFinalBlockSucceeds(ReadOnlySequenc
431456
};
432457

433458
formReader.ParseFormValues(ref readOnlySequence, ref accumulator, isFinalBlock: true);
459+
Assert.True(readOnlySequence.IsEmpty);
434460

435461
IDictionary<string, StringValues> values = accumulator.GetResults();
436462
Assert.Contains("fo", values);

0 commit comments

Comments
 (0)