Skip to content

Commit 1368229

Browse files
committed
Merge branch 'release/9.1.0'
2 parents 2125897 + 59e421f commit 1368229

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+1228
-466
lines changed

CodeCoverage.runsettings

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<RunSettings>
3+
<DataCollectionRunSettings>
4+
<DataCollectors>
5+
<DataCollector friendlyName="Code Coverage" uri="datacollector://Microsoft/CodeCoverage/2.0" assemblyQualifiedName="Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector, Microsoft.VisualStudio.TraceCollector, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
6+
<Configuration>
7+
<CodeCoverage>
8+
<Format>coverage</Format>
9+
10+
<!-- Match fully qualified names of functions: -->
11+
<Functions>
12+
<Exclude>
13+
<Function>Http-Multipart-Data-Parser\.Properties\..*</Function>
14+
<Function>Http-Multipart-Data-Parser\.Models\..*</Function>
15+
<Function>Http-Multipart-Data-Parser\.Utilities\.Log\..*</Function>
16+
<Function>System\.Text\.Json\.SourceGeneration\..*</Function>
17+
<Function>System\.Runtime\.CompilerServices\..*</Function>
18+
</Exclude>
19+
</Functions>
20+
21+
<!-- Match attributes on any code element: -->
22+
<Attributes>
23+
<Exclude>
24+
<Attribute>Http-Multipart-Data-Parser\.Utilities\.ExcludeFromCodeCoverageAttribute</Attribute>
25+
<Attribute>System\.Obsolete</Attribute>
26+
<Attribute>System\.CodeDom\.Compiler\.GeneratedCodeAttribute</Attribute>
27+
<Attribute>System\.Runtime\.CompilerServices\.CompilerGeneratedAttribute</Attribute>
28+
</Exclude>
29+
</Attributes>
30+
31+
<!-- We recommend you do not change the following values: -->
32+
33+
<!-- Set this to True to collect coverage information for functions marked with the "SecuritySafeCritical" attribute. Instead of writing directly into a memory location from such functions, code coverage inserts a probe that redirects to another function, which in turns writes into memory. -->
34+
<UseVerifiableInstrumentation>True</UseVerifiableInstrumentation>
35+
<!-- When set to True, collects coverage information from child processes that are launched with low-level ACLs, for example, UWP apps. -->
36+
<AllowLowIntegrityProcesses>True</AllowLowIntegrityProcesses>
37+
<!-- When set to True, collects coverage information from child processes that are launched by test or production code. -->
38+
<CollectFromChildProcesses>True</CollectFromChildProcesses>
39+
<!-- When set to True, restarts the IIS process and collects coverage information from it. -->
40+
<CollectAspDotNet>False</CollectAspDotNet>
41+
<!-- When set to True, static native instrumentation will be enabled. -->
42+
<EnableStaticNativeInstrumentation>True</EnableStaticNativeInstrumentation>
43+
<!-- When set to True, dynamic native instrumentation will be enabled. -->
44+
<EnableDynamicNativeInstrumentation>True</EnableDynamicNativeInstrumentation>
45+
<!-- When set to True, instrumented binaries on disk are removed and original files are restored. -->
46+
<EnableStaticNativeInstrumentationRestore>True</EnableStaticNativeInstrumentationRestore>
47+
<!-- When set to False, test assemblies will not be added to the coverage report. -->
48+
<IncludeTestAssembly>True</IncludeTestAssembly>
49+
</CodeCoverage>
50+
</Configuration>
51+
</DataCollector>
52+
</DataCollectors>
53+
</DataCollectionRunSettings>
54+
</RunSettings>

GitReleaseManager.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ create:
44
footer-content: You can download this release from [nuget.org](https://www.nuget.org/packages/Http-Multipart-Data-Parser/{milestone})
55
footer-includes-milestone: true
66
milestone-replace-text: '{milestone}'
7+
include-contributors: true
78
close:
89
use-issue-comments: true
10+
set-due-date: true
911
issue-comment: |-
1012
:tada: This issue has been resolved in version {milestone} :tada:
1113

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ PM> Install-Package HttpMultipartParser
2727

2828
## .NET framework suport
2929

30-
- The parser was built for and tested on .NET 4.8, .NET standard 2.1, .NET 5.0 and .NET 6.0.
30+
- The parser currently supports .NET framework 4.8 and any framework supporting `.NET Standard 2.1` (which includes .NET 5.0 and all subsequent versions as well as some legacy versions such as .NET Core 3.x and ASP.NET Core 3.x).
3131
- Version 5.1.0 was the last version that supported .NET 4.6.1, NET 4.7.2 and .NET standard 2.0.
3232
- Version 2.2.4 was the last version that supported older .NET platforms such as .NET 4.5 and .NET standard 1.3.
3333

@@ -90,7 +90,7 @@ parser.FileHandler += (name, fileName, type, disposition, buffer, bytes, partNum
9090
{
9191
// Write the part of the file we've received to a file stream. (Or do something else)
9292
filestream.Write(buffer, 0, bytes);
93-
}
93+
};
9494

9595
// You can parse synchronously:
9696
parser.Run();

Source/HttpMultipartParser.Benchmark/HttpMultipartParser.Benchmark.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
</PropertyGroup>
77

88
<ItemGroup>
9-
<PackageReference Include="BenchmarkDotNet" Version="0.14.0" />
9+
<PackageReference Include="BenchmarkDotNet" Version="0.15.2" />
1010
</ItemGroup>
1111

1212
<ItemGroup>

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));
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);
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);
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);
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);
249+
var parser = await MultipartFormDataParser.ParseAsync(stream, options, TestContext.Current.CancellationToken);
215250
Assert.Single(parser.Files);
216251
}
217252
}

Source/HttpMultipartParser.UnitTests/HttpMultipartParser.UnitTests.csproj

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,25 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
44
<TargetFrameworks>net48;net9.0</TargetFrameworks>
55
<AssemblyName>HttpMultipartParser.UnitTests</AssemblyName>
66
<RootNamespace>HttpMultipartParser.UnitTests</RootNamespace>
7+
<IsPackable>false</IsPackable>
8+
<IsTestProject>true</IsTestProject>
9+
<OutputType>Exe</OutputType>
10+
</PropertyGroup>
11+
12+
<!-- Enable the MSTest runner -->
13+
<PropertyGroup>
14+
<EnableMSTestRunner>true</EnableMSTestRunner>
15+
<TestingPlatformDotnetTestSupport>true</TestingPlatformDotnetTestSupport>
16+
<UseMicrosoftTestingPlatformRunner>true</UseMicrosoftTestingPlatformRunner>
717
</PropertyGroup>
818

919
<ItemGroup>
10-
<PackageReference Include="coverlet.msbuild" Version="6.0.4">
11-
<PrivateAssets>all</PrivateAssets>
12-
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
13-
</PackageReference>
14-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
15-
<PackageReference Include="xunit" Version="2.9.3" />
16-
<PackageReference Include="xunit.runner.visualstudio" Version="3.0.1">
17-
<PrivateAssets>all</PrivateAssets>
18-
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
19-
</PackageReference>
20+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
21+
<PackageReference Include="Microsoft.Testing.Extensions.CodeCoverage" Version="17.14.2" />
22+
<PackageReference Include="xunit.v3" Version="3.0.1" />
2023
</ItemGroup>
2124

2225
<ItemGroup>

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);
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);
76+
var parser = await MultipartFormDataParser.ParseAsync(stream, options, TestContext.Current.CancellationToken);
6777
Assert.True(_testCase.Validate(parser));
6878
}
6979
}

0 commit comments

Comments
 (0)