Skip to content

Commit ee1facd

Browse files
committed
Merge branch 'feature/parser_options' into develop
Resolves #127
2 parents e199922 + 73bf593 commit ee1facd

30 files changed

Lines changed: 899 additions & 339 deletions

Source/HttpMultipartParser.Benchmark/MultipartFormDataParserBenchmark.cs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using BenchmarkDotNet.Attributes;
22
using System.IO;
3+
using System.Threading;
34
using System.Threading.Tasks;
45

56
namespace HttpMultipartParser.Benchmark
@@ -24,22 +25,37 @@ public MultipartFormDataParserBenchmark()
2425
[Benchmark]
2526
public async Task<MultipartFormDataParser> Small()
2627
{
28+
var options = new ParserOptions
29+
{
30+
Boundary = "boundary"
31+
};
32+
2733
small.Position = 0;
28-
return await MultipartFormDataParser.ParseAsync(small, "boundary").ConfigureAwait(false);
34+
return await MultipartFormDataParser.ParseAsync(small, options, CancellationToken.None).ConfigureAwait(false);
2935
}
3036

3137
[Benchmark]
3238
public async Task<MultipartFormDataParser> Medium()
3339
{
40+
var options = new ParserOptions
41+
{
42+
Boundary = "boundary"
43+
};
44+
3445
medium.Position = 0;
35-
return await MultipartFormDataParser.ParseAsync(medium, "boundary").ConfigureAwait(false);
46+
return await MultipartFormDataParser.ParseAsync(medium, options, CancellationToken.None).ConfigureAwait(false);
3647
}
3748

3849
[Benchmark]
3950
public async Task<MultipartFormDataParser> Large()
4051
{
52+
var options = new ParserOptions
53+
{
54+
Boundary = "boundary"
55+
};
56+
4157
large.Position = 0;
42-
return await MultipartFormDataParser.ParseAsync(large, "boundary").ConfigureAwait(false);
58+
return await MultipartFormDataParser.ParseAsync(large, options, CancellationToken.None).ConfigureAwait(false);
4359
}
4460
}
4561
}

Source/HttpMultipartParser.UnitTests/HttpMultipartFormParserUnitTests.cs

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@ public class HttpMultipartFormParserUnitTests
4040
[Fact]
4141
public void ConstructingWithNullStreamFails()
4242
{
43-
Assert.Throws<ArgumentNullException>(() => MultipartFormDataParser.Parse(Stream.Null));
43+
Assert.Throws<ArgumentNullException>(() => MultipartFormDataParser.Parse(Stream.Null, null));
4444
}
4545

4646
[Fact]
4747
public async Task ConstructingWithNullStreamFailsAsync()
4848
{
49-
await Assert.ThrowsAsync<ArgumentNullException>(() => MultipartFormDataParser.ParseAsync(Stream.Null, cancellationToken: TestContext.Current.CancellationToken));
49+
await Assert.ThrowsAsync<ArgumentNullException>(() => MultipartFormDataParser.ParseAsync(Stream.Null, null, TestContext.Current.CancellationToken));
5050
}
5151

5252
/// <summary>
@@ -64,9 +64,14 @@ line 2
6464
line 3
6565
-----------------------------41952539122868--");
6666

67-
using (Stream stream = TestUtil.StringToStream(request, Encoding.UTF8))
67+
var options = new ParserOptions
6868
{
69-
var parser = MultipartFormDataParser.Parse(stream, Encoding.UTF8);
69+
Encoding = Encoding.UTF8,
70+
};
71+
72+
using (Stream stream = TestUtil.StringToStream(request, options.Encoding))
73+
{
74+
var parser = MultipartFormDataParser.Parse(stream, options);
7075
Assert.Equal($"line 1{Environment.NewLine}line 2{Environment.NewLine}line 3", parser.GetParameterValue("multilined"));
7176
Assert.Equal($"line 1{Environment.NewLine}line 2{Environment.NewLine}line 3", parser.GetParameterValues("multilined").First());
7277
}
@@ -87,9 +92,14 @@ line 2
8792
line 3
8893
-----------------------------41952539122868--");
8994

90-
using (Stream stream = TestUtil.StringToStream(request, Encoding.UTF8))
95+
var options = new ParserOptions
96+
{
97+
Encoding = Encoding.UTF8
98+
};
99+
100+
using (Stream stream = TestUtil.StringToStream(request, options.Encoding))
91101
{
92-
var parser = await MultipartFormDataParser.ParseAsync(stream, Encoding.UTF8, cancellationToken: TestContext.Current.CancellationToken);
102+
var parser = await MultipartFormDataParser.ParseAsync(stream, options, TestContext.Current.CancellationToken);
93103
Assert.Equal($"line 1{Environment.NewLine}line 2{Environment.NewLine}line 3", parser.GetParameterValue("multilined"));
94104
Assert.Equal($"line 1{Environment.NewLine}line 2{Environment.NewLine}line 3", parser.GetParameterValues("multilined").First());
95105
}
@@ -113,9 +123,14 @@ public void HandlesFileWithLastCrLfAtBufferLength()
113123
------WebKitFormBoundaryphElSb1aBJGfLyAP--
114124
";
115125

116-
using (Stream stream = TestUtil.StringToStream(request, Encoding.UTF8))
126+
var options = new ParserOptions
117127
{
118-
var parser = MultipartFormDataParser.Parse(stream, Encoding.UTF8);
128+
Encoding = Encoding.UTF8
129+
};
130+
131+
using (Stream stream = TestUtil.StringToStream(request, options.Encoding))
132+
{
133+
var parser = MultipartFormDataParser.Parse(stream, options);
119134
}
120135
}
121136

@@ -137,9 +152,14 @@ public async Task HandlesFileWithLastCrLfAtBufferLengthAsync()
137152
------WebKitFormBoundaryphElSb1aBJGfLyAP--
138153
";
139154

140-
using (Stream stream = TestUtil.StringToStream(request, Encoding.UTF8))
155+
var options = new ParserOptions
156+
{
157+
Encoding = Encoding.UTF8
158+
};
159+
160+
using (Stream stream = TestUtil.StringToStream(request, options.Encoding))
141161
{
142-
var parser = await MultipartFormDataParser.ParseAsync(stream, Encoding.UTF8, cancellationToken: TestContext.Current.CancellationToken);
162+
var parser = await MultipartFormDataParser.ParseAsync(stream, options, TestContext.Current.CancellationToken);
143163
}
144164
}
145165

@@ -161,9 +181,14 @@ public void HandlesFileWithLastCrLfImmediatlyAfterBufferLength()
161181
------WebKitFormBoundaryphElSb1aBJGfLyAP--
162182
";
163183

164-
using (Stream stream = TestUtil.StringToStream(request, Encoding.UTF8))
184+
var options = new ParserOptions
185+
{
186+
Encoding = Encoding.UTF8
187+
};
188+
189+
using (Stream stream = TestUtil.StringToStream(request, options.Encoding))
165190
{
166-
var parser = MultipartFormDataParser.Parse(stream, Encoding.UTF8);
191+
var parser = MultipartFormDataParser.Parse(stream, options);
167192
}
168193
}
169194

@@ -185,9 +210,14 @@ public async Task HandlesFileWithLastCrLfImmediatlyAfterBufferLengthAsync()
185210
------WebKitFormBoundaryphElSb1aBJGfLyAP--
186211
";
187212

188-
using (Stream stream = TestUtil.StringToStream(request, Encoding.UTF8))
213+
var options = new ParserOptions
189214
{
190-
var parser = await MultipartFormDataParser.ParseAsync(stream, Encoding.UTF8, cancellationToken: TestContext.Current.CancellationToken);
215+
Encoding = Encoding.UTF8
216+
};
217+
218+
using (Stream stream = TestUtil.StringToStream(request, options.Encoding))
219+
{
220+
var parser = await MultipartFormDataParser.ParseAsync(stream, options, TestContext.Current.CancellationToken);
191221
}
192222
}
193223

@@ -209,9 +239,14 @@ public async Task HandlesFileWithoutFilename()
209239
------WebKitFormBoundaryphElSb1aBJGfLyAP--
210240
";
211241

212-
using (Stream stream = TestUtil.StringToStream(request, Encoding.UTF8))
242+
var options = new ParserOptions
243+
{
244+
Encoding = Encoding.UTF8
245+
};
246+
247+
using (Stream stream = TestUtil.StringToStream(request, options.Encoding))
213248
{
214-
var parser = await MultipartFormDataParser.ParseAsync(stream, Encoding.UTF8, cancellationToken: TestContext.Current.CancellationToken);
249+
var parser = await MultipartFormDataParser.ParseAsync(stream, options, TestContext.Current.CancellationToken);
215250
Assert.Single(parser.Files);
216251
}
217252
}

Source/HttpMultipartParser.UnitTests/ParserScenarios/BlankLinesBeforeFirstBoundary.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,14 @@ public BlankLinesBeforeFirstBoundary()
4141
[Fact]
4242
public void CanAutoDetectBoundary()
4343
{
44-
using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
44+
var options = new ParserOptions
4545
{
46-
var parser = MultipartFormDataParser.Parse(stream);
46+
Encoding = Encoding.UTF8,
47+
};
48+
49+
using (Stream stream = TestUtil.StringToStream(_testCase.Request, options.Encoding))
50+
{
51+
var parser = MultipartFormDataParser.Parse(stream, null);
4752
Assert.True(_testCase.Validate(parser));
4853
}
4954
}
@@ -54,9 +59,14 @@ public void CanAutoDetectBoundary()
5459
[Fact]
5560
public async Task CanAutoDetectBoundaryAsync()
5661
{
57-
using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
62+
var options = new ParserOptions
63+
{
64+
Encoding = Encoding.UTF8,
65+
};
66+
67+
using (Stream stream = TestUtil.StringToStream(_testCase.Request, options.Encoding))
5868
{
59-
var parser = await MultipartFormDataParser.ParseAsync(stream, Encoding.UTF8, cancellationToken: TestContext.Current.CancellationToken);
69+
var parser = await MultipartFormDataParser.ParseAsync(stream, options, TestContext.Current.CancellationToken);
6070
Assert.True(_testCase.Validate(parser));
6171
}
6272
}

Source/HttpMultipartParser.UnitTests/ParserScenarios/BoundaryEndsWithDoubleDash.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,14 @@ public BoundaryEndsWithDoubleDash()
4848
[Fact]
4949
public void CanAutoDetectBoundary()
5050
{
51-
using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
51+
var options = new ParserOptions
5252
{
53-
var parser = MultipartFormDataParser.Parse(stream);
53+
Encoding = Encoding.UTF8,
54+
};
55+
56+
using (Stream stream = TestUtil.StringToStream(_testCase.Request, options.Encoding))
57+
{
58+
var parser = MultipartFormDataParser.Parse(stream, options);
5459
Assert.True(_testCase.Validate(parser));
5560
}
5661
}
@@ -61,9 +66,14 @@ public void CanAutoDetectBoundary()
6166
[Fact]
6267
public async Task CanAutoDetectBoundaryAsync()
6368
{
64-
using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
69+
var options = new ParserOptions
70+
{
71+
Encoding = Encoding.UTF8,
72+
};
73+
74+
using (Stream stream = TestUtil.StringToStream(_testCase.Request, options.Encoding))
6575
{
66-
var parser = await MultipartFormDataParser.ParseAsync(stream, Encoding.UTF8, cancellationToken: TestContext.Current.CancellationToken);
76+
var parser = await MultipartFormDataParser.ParseAsync(stream, options, TestContext.Current.CancellationToken);
6777
Assert.True(_testCase.Validate(parser));
6878
}
6979
}

Source/HttpMultipartParser.UnitTests/ParserScenarios/EmptyForm.cs

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,39 +29,59 @@ public EmptyForm()
2929
[Fact]
3030
public void Parse_empty_form_boundary_specified()
3131
{
32-
using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
32+
var options = new ParserOptions
3333
{
34-
var parser = MultipartFormDataParser.Parse(stream, "----WebKitFormBoundaryb4SfPlH9Bv7c2PKS");
34+
Boundary = "----WebKitFormBoundaryb4SfPlH9Bv7c2PKS"
35+
};
36+
37+
using (Stream stream = TestUtil.StringToStream(_testCase.Request, options.Encoding))
38+
{
39+
var parser = MultipartFormDataParser.Parse(stream, options);
3540
Assert.True(_testCase.Validate(parser));
3641
}
3742
}
3843

3944
[Fact]
4045
public void Parse_empty_form_boundary_omitted()
4146
{
42-
using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
47+
var options = new ParserOptions
48+
{
49+
Encoding = Encoding.UTF8,
50+
};
51+
52+
using (Stream stream = TestUtil.StringToStream(_testCase.Request, options.Encoding))
4353
{
44-
var parser = MultipartFormDataParser.Parse(stream);
54+
var parser = MultipartFormDataParser.Parse(stream, options);
4555
Assert.True(_testCase.Validate(parser));
4656
}
4757
}
4858

4959
[Fact]
5060
public async Task Parse_empty_form_boundary_specified_async()
5161
{
52-
using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
62+
var options = new ParserOptions
5363
{
54-
var parser = await MultipartFormDataParser.ParseAsync(stream, "----WebKitFormBoundaryb4SfPlH9Bv7c2PKS", cancellationToken: TestContext.Current.CancellationToken);
64+
Boundary = "----WebKitFormBoundaryb4SfPlH9Bv7c2PKS"
65+
};
66+
67+
using (Stream stream = TestUtil.StringToStream(_testCase.Request, options.Encoding))
68+
{
69+
var parser = await MultipartFormDataParser.ParseAsync(stream, options, TestContext.Current.CancellationToken);
5570
Assert.True(_testCase.Validate(parser));
5671
}
5772
}
5873

5974
[Fact]
6075
public async Task Parse_empty_form_boundary_omitted_async()
6176
{
62-
using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
77+
var options = new ParserOptions
78+
{
79+
Encoding = Encoding.UTF8,
80+
};
81+
82+
using (Stream stream = TestUtil.StringToStream(_testCase.Request, options.Encoding))
6383
{
64-
var parser = await MultipartFormDataParser.ParseAsync(stream, cancellationToken: TestContext.Current.CancellationToken);
84+
var parser = await MultipartFormDataParser.ParseAsync(stream, options, TestContext.Current.CancellationToken);
6585
Assert.True(_testCase.Validate(parser));
6686
}
6787
}

Source/HttpMultipartParser.UnitTests/ParserScenarios/ExactBufferTruncate.cs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,16 @@ public ExactBufferTruncate()
5252
[Fact]
5353
public void CanHandleFinalDashesInSeperateBufferFromEndBinary()
5454
{
55-
using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
55+
var options = new ParserOptions
5656
{
57-
var parser = MultipartFormDataParser.Parse(stream, "boundary", Encoding.UTF8, 16);
57+
Boundary = "boundary",
58+
BinaryBufferSize = 16,
59+
Encoding = Encoding.UTF8
60+
};
61+
62+
using (Stream stream = TestUtil.StringToStream(_testCase.Request, options.Encoding))
63+
{
64+
var parser = MultipartFormDataParser.Parse(stream, options);
5865
Assert.True(_testCase.Validate(parser));
5966
}
6067
}
@@ -65,9 +72,16 @@ public void CanHandleFinalDashesInSeperateBufferFromEndBinary()
6572
[Fact]
6673
public async Task CanHandleFinalDashesInSeperateBufferFromEndBinaryAsync()
6774
{
68-
using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
75+
var options = new ParserOptions
76+
{
77+
Boundary = "boundary",
78+
BinaryBufferSize = 16,
79+
Encoding = Encoding.UTF8
80+
};
81+
82+
using (Stream stream = TestUtil.StringToStream(_testCase.Request, options.Encoding))
6983
{
70-
var parser = await MultipartFormDataParser.ParseAsync(stream, "boundary", Encoding.UTF8, 16, cancellationToken: TestContext.Current.CancellationToken);
84+
var parser = await MultipartFormDataParser.ParseAsync(stream, options, TestContext.Current.CancellationToken);
7185
Assert.True(_testCase.Validate(parser));
7286
}
7387
}

Source/HttpMultipartParser.UnitTests/ParserScenarios/FileIsLast.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,29 @@ public FileIsLast()
4545
[Fact]
4646
public void CanHandleFileAsLastSection()
4747
{
48-
using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
48+
var options = new ParserOptions
4949
{
50-
var parser = MultipartFormDataParser.Parse(stream, Encoding.UTF8);
50+
Encoding = Encoding.UTF8
51+
};
52+
53+
using (Stream stream = TestUtil.StringToStream(_testCase.Request, options.Encoding))
54+
{
55+
var parser = MultipartFormDataParser.Parse(stream, options);
5156
Assert.True(_testCase.Validate(parser));
5257
}
5358
}
5459

5560
[Fact]
5661
public async Task CanHandleFileAsLastSectionAsync()
5762
{
58-
using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
63+
var options = new ParserOptions
64+
{
65+
Encoding = Encoding.UTF8
66+
};
67+
68+
using (Stream stream = TestUtil.StringToStream(_testCase.Request, options.Encoding))
5969
{
60-
var parser = await MultipartFormDataParser.ParseAsync(stream, Encoding.UTF8, cancellationToken: TestContext.Current.CancellationToken);
70+
var parser = await MultipartFormDataParser.ParseAsync(stream, options, TestContext.Current.CancellationToken);
6171
Assert.True(_testCase.Validate(parser));
6272
}
6373
}

0 commit comments

Comments
 (0)