11// Copyright (c) .NET Foundation. All rights reserved.
22// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33
4+ using System . Collections . Generic ;
45using System . IO ;
5- using System . Linq ;
66using System . Text ;
77using System . Threading . Tasks ;
8+ using Microsoft . Extensions . Primitives ;
89using Xunit ;
910
1011namespace Microsoft . AspNetCore . WebUtilities
@@ -18,7 +19,7 @@ public async Task ReadFormAsync_EmptyKeyAtEndAllowed(bool bufferRequest)
1819 {
1920 var body = MakeStream ( bufferRequest , "=bar" ) ;
2021
21- var formCollection = await new FormReader ( body ) . ReadFormAsync ( ) ;
22+ var formCollection = await ReadFormAsync ( new FormReader ( body ) ) ;
2223
2324 Assert . Equal ( "bar" , formCollection [ "" ] . ToString ( ) ) ;
2425 }
@@ -30,7 +31,7 @@ public async Task ReadFormAsync_EmptyKeyWithAdditionalEntryAllowed(bool bufferRe
3031 {
3132 var body = MakeStream ( bufferRequest , "=bar&baz=2" ) ;
3233
33- var formCollection = await new FormReader ( body ) . ReadFormAsync ( ) ;
34+ var formCollection = await ReadFormAsync ( new FormReader ( body ) ) ;
3435
3536 Assert . Equal ( "bar" , formCollection [ "" ] . ToString ( ) ) ;
3637 Assert . Equal ( "2" , formCollection [ "baz" ] . ToString ( ) ) ;
@@ -43,7 +44,7 @@ public async Task ReadFormAsync_EmptyValuedAtEndAllowed(bool bufferRequest)
4344 {
4445 var body = MakeStream ( bufferRequest , "foo=" ) ;
4546
46- var formCollection = await new FormReader ( body ) . ReadFormAsync ( ) ;
47+ var formCollection = await ReadFormAsync ( new FormReader ( body ) ) ;
4748
4849 Assert . Equal ( "" , formCollection [ "foo" ] . ToString ( ) ) ;
4950 }
@@ -55,7 +56,7 @@ public async Task ReadFormAsync_EmptyValuedWithAdditionalEntryAllowed(bool buffe
5556 {
5657 var body = MakeStream ( bufferRequest , "foo=&baz=2" ) ;
5758
58- var formCollection = await new FormReader ( body ) . ReadFormAsync ( ) ;
59+ var formCollection = await ReadFormAsync ( new FormReader ( body ) ) ;
5960
6061 Assert . Equal ( "" , formCollection [ "foo" ] . ToString ( ) ) ;
6162 Assert . Equal ( "2" , formCollection [ "baz" ] . ToString ( ) ) ;
@@ -68,7 +69,7 @@ public async Task ReadFormAsync_KeyCountLimitMet_Success(bool bufferRequest)
6869 {
6970 var body = MakeStream ( bufferRequest , "foo=1&bar=2&baz=3&baz=4" ) ;
7071
71- var formCollection = await new FormReader ( body ) { KeyCountLimit = 3 } . ReadFormAsync ( ) ;
72+ var formCollection = await ReadFormAsync ( new FormReader ( body ) { KeyCountLimit = 3 } ) ;
7273
7374 Assert . Equal ( "1" , formCollection [ "foo" ] . ToString ( ) ) ;
7475 Assert . Equal ( "2" , formCollection [ "bar" ] . ToString ( ) ) ;
@@ -84,7 +85,7 @@ public async Task ReadFormAsync_KeyCountLimitExceeded_Throw(bool bufferRequest)
8485 var body = MakeStream ( bufferRequest , "foo=1&baz=2&bar=3&baz=4&baf=5" ) ;
8586
8687 var exception = await Assert . ThrowsAsync < InvalidDataException > (
87- ( ) => new FormReader ( body ) { KeyCountLimit = 3 } . ReadFormAsync ( ) ) ;
88+ ( ) => ReadFormAsync ( new FormReader ( body ) { KeyCountLimit = 3 } ) ) ;
8889 Assert . Equal ( "Form key count limit 3 exceeded." , exception . Message ) ;
8990 }
9091
@@ -95,7 +96,7 @@ public async Task ReadFormAsync_KeyLengthLimitMet_Success(bool bufferRequest)
9596 {
9697 var body = MakeStream ( bufferRequest , "foo=1&bar=2&baz=3&baz=4" ) ;
9798
98- var formCollection = await new FormReader ( body ) { KeyLengthLimit = 10 } . ReadFormAsync ( ) ;
99+ var formCollection = await ReadFormAsync ( new FormReader ( body ) { KeyLengthLimit = 10 } ) ;
99100
100101 Assert . Equal ( "1" , formCollection [ "foo" ] . ToString ( ) ) ;
101102 Assert . Equal ( "2" , formCollection [ "bar" ] . ToString ( ) ) ;
@@ -111,7 +112,7 @@ public async Task ReadFormAsync_KeyLengthLimitExceeded_Throw(bool bufferRequest)
111112 var body = MakeStream ( bufferRequest , "foo=1&baz1234567890=2" ) ;
112113
113114 var exception = await Assert . ThrowsAsync < InvalidDataException > (
114- ( ) => new FormReader ( body ) { KeyLengthLimit = 10 } . ReadFormAsync ( ) ) ;
115+ ( ) => ReadFormAsync ( new FormReader ( body ) { KeyLengthLimit = 10 } ) ) ;
115116 Assert . Equal ( "Form key or value length limit 10 exceeded." , exception . Message ) ;
116117 }
117118
@@ -122,7 +123,7 @@ public async Task ReadFormAsync_ValueLengthLimitMet_Success(bool bufferRequest)
122123 {
123124 var body = MakeStream ( bufferRequest , "foo=1&bar=1234567890&baz=3&baz=4" ) ;
124125
125- var formCollection = await new FormReader ( body ) { ValueLengthLimit = 10 } . ReadFormAsync ( ) ;
126+ var formCollection = await ReadFormAsync ( new FormReader ( body ) { ValueLengthLimit = 10 } ) ;
126127
127128 Assert . Equal ( "1" , formCollection [ "foo" ] . ToString ( ) ) ;
128129 Assert . Equal ( "1234567890" , formCollection [ "bar" ] . ToString ( ) ) ;
@@ -138,10 +139,54 @@ public async Task ReadFormAsync_ValueLengthLimitExceeded_Throw(bool bufferReques
138139 var body = MakeStream ( bufferRequest , "foo=1&baz=1234567890123" ) ;
139140
140141 var exception = await Assert . ThrowsAsync < InvalidDataException > (
141- ( ) => new FormReader ( body ) { ValueLengthLimit = 10 } . ReadFormAsync ( ) ) ;
142+ ( ) => ReadFormAsync ( new FormReader ( body ) { ValueLengthLimit = 10 } ) ) ;
142143 Assert . Equal ( "Form key or value length limit 10 exceeded." , exception . Message ) ;
143144 }
144145
146+ [ Theory ]
147+ [ InlineData ( true ) ]
148+ [ InlineData ( false ) ]
149+ public async Task ReadNextPair_ReadsAllPairs ( bool bufferRequest )
150+ {
151+ var body = MakeStream ( bufferRequest , "foo=&baz=2" ) ;
152+
153+ var reader = new FormReader ( body ) ;
154+
155+ var pair = ( KeyValuePair < string , string > ) await ReadPair ( reader ) ;
156+
157+ Assert . Equal ( "foo" , pair . Key ) ;
158+ Assert . Equal ( "" , pair . Value ) ;
159+
160+ pair = ( KeyValuePair < string , string > ) await ReadPair ( reader ) ;
161+
162+ Assert . Equal ( "baz" , pair . Key ) ;
163+ Assert . Equal ( "2" , pair . Value ) ;
164+
165+ Assert . Null ( await ReadPair ( reader ) ) ;
166+ }
167+
168+ [ Theory ]
169+ [ InlineData ( true ) ]
170+ [ InlineData ( false ) ]
171+ public async Task ReadNextPair_ReturnsNullOnEmptyStream ( bool bufferRequest )
172+ {
173+ var body = MakeStream ( bufferRequest , "" ) ;
174+
175+ var reader = new FormReader ( body ) ;
176+
177+ Assert . Null ( await ReadPair ( reader ) ) ;
178+ }
179+
180+ protected virtual Task < Dictionary < string , StringValues > > ReadFormAsync ( FormReader reader )
181+ {
182+ return Task . FromResult ( reader . ReadForm ( ) ) ;
183+ }
184+
185+ protected virtual Task < KeyValuePair < string , string > ? > ReadPair ( FormReader reader )
186+ {
187+ return Task . FromResult ( reader . ReadNextPair ( ) ) ;
188+ }
189+
145190 private static Stream MakeStream ( bool bufferRequest , string text )
146191 {
147192 var formContent = Encoding . UTF8 . GetBytes ( text ) ;
0 commit comments