1
1
// Copyright (c) .NET Foundation. All rights reserved.
2
2
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3
3
4
+ using System . Collections . Generic ;
4
5
using System . IO ;
5
- using System . Linq ;
6
6
using System . Text ;
7
7
using System . Threading . Tasks ;
8
+ using Microsoft . Extensions . Primitives ;
8
9
using Xunit ;
9
10
10
11
namespace Microsoft . AspNetCore . WebUtilities
@@ -18,7 +19,7 @@ public async Task ReadFormAsync_EmptyKeyAtEndAllowed(bool bufferRequest)
18
19
{
19
20
var body = MakeStream ( bufferRequest , "=bar" ) ;
20
21
21
- var formCollection = await new FormReader ( body ) . ReadFormAsync ( ) ;
22
+ var formCollection = await ReadFormAsync ( new FormReader ( body ) ) ;
22
23
23
24
Assert . Equal ( "bar" , formCollection [ "" ] . ToString ( ) ) ;
24
25
}
@@ -30,7 +31,7 @@ public async Task ReadFormAsync_EmptyKeyWithAdditionalEntryAllowed(bool bufferRe
30
31
{
31
32
var body = MakeStream ( bufferRequest , "=bar&baz=2" ) ;
32
33
33
- var formCollection = await new FormReader ( body ) . ReadFormAsync ( ) ;
34
+ var formCollection = await ReadFormAsync ( new FormReader ( body ) ) ;
34
35
35
36
Assert . Equal ( "bar" , formCollection [ "" ] . ToString ( ) ) ;
36
37
Assert . Equal ( "2" , formCollection [ "baz" ] . ToString ( ) ) ;
@@ -43,7 +44,7 @@ public async Task ReadFormAsync_EmptyValuedAtEndAllowed(bool bufferRequest)
43
44
{
44
45
var body = MakeStream ( bufferRequest , "foo=" ) ;
45
46
46
- var formCollection = await new FormReader ( body ) . ReadFormAsync ( ) ;
47
+ var formCollection = await ReadFormAsync ( new FormReader ( body ) ) ;
47
48
48
49
Assert . Equal ( "" , formCollection [ "foo" ] . ToString ( ) ) ;
49
50
}
@@ -55,7 +56,7 @@ public async Task ReadFormAsync_EmptyValuedWithAdditionalEntryAllowed(bool buffe
55
56
{
56
57
var body = MakeStream ( bufferRequest , "foo=&baz=2" ) ;
57
58
58
- var formCollection = await new FormReader ( body ) . ReadFormAsync ( ) ;
59
+ var formCollection = await ReadFormAsync ( new FormReader ( body ) ) ;
59
60
60
61
Assert . Equal ( "" , formCollection [ "foo" ] . ToString ( ) ) ;
61
62
Assert . Equal ( "2" , formCollection [ "baz" ] . ToString ( ) ) ;
@@ -68,7 +69,7 @@ public async Task ReadFormAsync_KeyCountLimitMet_Success(bool bufferRequest)
68
69
{
69
70
var body = MakeStream ( bufferRequest , "foo=1&bar=2&baz=3&baz=4" ) ;
70
71
71
- var formCollection = await new FormReader ( body ) { KeyCountLimit = 3 } . ReadFormAsync ( ) ;
72
+ var formCollection = await ReadFormAsync ( new FormReader ( body ) { KeyCountLimit = 3 } ) ;
72
73
73
74
Assert . Equal ( "1" , formCollection [ "foo" ] . ToString ( ) ) ;
74
75
Assert . Equal ( "2" , formCollection [ "bar" ] . ToString ( ) ) ;
@@ -84,7 +85,7 @@ public async Task ReadFormAsync_KeyCountLimitExceeded_Throw(bool bufferRequest)
84
85
var body = MakeStream ( bufferRequest , "foo=1&baz=2&bar=3&baz=4&baf=5" ) ;
85
86
86
87
var exception = await Assert . ThrowsAsync < InvalidDataException > (
87
- ( ) => new FormReader ( body ) { KeyCountLimit = 3 } . ReadFormAsync ( ) ) ;
88
+ ( ) => ReadFormAsync ( new FormReader ( body ) { KeyCountLimit = 3 } ) ) ;
88
89
Assert . Equal ( "Form key count limit 3 exceeded." , exception . Message ) ;
89
90
}
90
91
@@ -95,7 +96,7 @@ public async Task ReadFormAsync_KeyLengthLimitMet_Success(bool bufferRequest)
95
96
{
96
97
var body = MakeStream ( bufferRequest , "foo=1&bar=2&baz=3&baz=4" ) ;
97
98
98
- var formCollection = await new FormReader ( body ) { KeyLengthLimit = 10 } . ReadFormAsync ( ) ;
99
+ var formCollection = await ReadFormAsync ( new FormReader ( body ) { KeyLengthLimit = 10 } ) ;
99
100
100
101
Assert . Equal ( "1" , formCollection [ "foo" ] . ToString ( ) ) ;
101
102
Assert . Equal ( "2" , formCollection [ "bar" ] . ToString ( ) ) ;
@@ -111,7 +112,7 @@ public async Task ReadFormAsync_KeyLengthLimitExceeded_Throw(bool bufferRequest)
111
112
var body = MakeStream ( bufferRequest , "foo=1&baz1234567890=2" ) ;
112
113
113
114
var exception = await Assert . ThrowsAsync < InvalidDataException > (
114
- ( ) => new FormReader ( body ) { KeyLengthLimit = 10 } . ReadFormAsync ( ) ) ;
115
+ ( ) => ReadFormAsync ( new FormReader ( body ) { KeyLengthLimit = 10 } ) ) ;
115
116
Assert . Equal ( "Form key or value length limit 10 exceeded." , exception . Message ) ;
116
117
}
117
118
@@ -122,7 +123,7 @@ public async Task ReadFormAsync_ValueLengthLimitMet_Success(bool bufferRequest)
122
123
{
123
124
var body = MakeStream ( bufferRequest , "foo=1&bar=1234567890&baz=3&baz=4" ) ;
124
125
125
- var formCollection = await new FormReader ( body ) { ValueLengthLimit = 10 } . ReadFormAsync ( ) ;
126
+ var formCollection = await ReadFormAsync ( new FormReader ( body ) { ValueLengthLimit = 10 } ) ;
126
127
127
128
Assert . Equal ( "1" , formCollection [ "foo" ] . ToString ( ) ) ;
128
129
Assert . Equal ( "1234567890" , formCollection [ "bar" ] . ToString ( ) ) ;
@@ -138,10 +139,54 @@ public async Task ReadFormAsync_ValueLengthLimitExceeded_Throw(bool bufferReques
138
139
var body = MakeStream ( bufferRequest , "foo=1&baz=1234567890123" ) ;
139
140
140
141
var exception = await Assert . ThrowsAsync < InvalidDataException > (
141
- ( ) => new FormReader ( body ) { ValueLengthLimit = 10 } . ReadFormAsync ( ) ) ;
142
+ ( ) => ReadFormAsync ( new FormReader ( body ) { ValueLengthLimit = 10 } ) ) ;
142
143
Assert . Equal ( "Form key or value length limit 10 exceeded." , exception . Message ) ;
143
144
}
144
145
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
+
145
190
private static Stream MakeStream ( bool bufferRequest , string text )
146
191
{
147
192
var formContent = Encoding . UTF8 . GetBytes ( text ) ;
0 commit comments