Skip to content

Commit b2204f1

Browse files
committed
Merge branch 'release/6.0.0'
2 parents 1c3610e + a709c69 commit b2204f1

12 files changed

Lines changed: 156 additions & 48 deletions

File tree

.config/dotnet-tools.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"isRoot": true,
44
"tools": {
55
"cake.tool": {
6-
"version": "2.1.0",
6+
"version": "2.2.0",
77
"commands": [
88
"dotnet-cake"
99
]

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,7 @@ __pycache__/
330330
*.pyc
331331

332332
# Cake
333+
.cake/**
333334
tools/**
334335
BuildArtifacts/
335336

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ PM> Install-Package HttpMultipartParser
2727

2828
## .NET framework suport
2929

30-
The parser was built for and tested on NET 4.6.1, NET 4,7,2 and NETSTANDARD 2.0. Versions 2.2.4 was the last version of HttpMultipartParser that supported older .NET platforms such as NET 4.5 and NETSTANDARD 1.3.
30+
The parser was built for and tested on .NET 4.8, .NET standard 2.1, .NET 5.0 and .NET 6.0.
31+
Version 5.1.0 was the last version that supported .NET 4.6.1, NET 4.7.2 and .NET standard 2.0.
32+
Version 2.2.4 was the last version that supported older .NET platforms such as .NET 4.5 and .NET standard 1.3.
3133

3234
## Usage
3335

Source/HttpMultipartParser.Benchmark/HttpMultipartParser.Benchmark.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFramework>net5.0</TargetFramework>
5+
<TargetFramework>net6.0</TargetFramework>
66
</PropertyGroup>
77

88
<ItemGroup>

Source/HttpMultipartParser.UnitTests/HttpMultipartParser.UnitTests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFrameworks>net461;net472;netcoreapp3.1;net5.0</TargetFrameworks>
4+
<TargetFrameworks>net48;netcoreapp3.1;net5.0;net6.0</TargetFrameworks>
55
<AssemblyName>HttpMultipartParser.UnitTests</AssemblyName>
66
<RootNamespace>HttpMultipartParser.UnitTests</RootNamespace>
77
</PropertyGroup>

Source/HttpMultipartParser.UnitTests/ParserScenarios/TinyData.cs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
using System.Collections.Generic;
23
using System.IO;
34
using System.Text;
@@ -231,6 +232,50 @@ public async Task GetParameterValueReturnsNullIfNoParameterFoundAsync()
231232
}
232233
}
233234

235+
[Fact]
236+
public void GetParameterValueReturnsCorrectlyWithoutComparisonType()
237+
{
238+
using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
239+
{
240+
var parser = MultipartFormDataParser.Parse(stream, "boundry", Encoding.UTF8);
241+
Assert.NotNull(parser.GetParameterValue("text"));
242+
Assert.Null(parser.GetParameterValue("Text"));
243+
}
244+
}
245+
246+
[Fact]
247+
public async Task GetParameterValueReturnsCorrectlyWithoutComparisonTypeAsync()
248+
{
249+
using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
250+
{
251+
var parser = await MultipartFormDataParser.ParseAsync(stream, "boundry", Encoding.UTF8);
252+
Assert.NotNull(parser.GetParameterValue("text"));
253+
Assert.Null(parser.GetParameterValue("Text"));
254+
}
255+
}
256+
257+
[Fact]
258+
public void GetParameterValueReturnsCorrectlyWithComparisonType()
259+
{
260+
using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
261+
{
262+
var parser = MultipartFormDataParser.Parse(stream, "boundry", Encoding.UTF8);
263+
Assert.NotNull(parser.GetParameterValue("text",StringComparison.OrdinalIgnoreCase));
264+
Assert.NotNull(parser.GetParameterValue("Text",StringComparison.OrdinalIgnoreCase));
265+
}
266+
}
267+
268+
[Fact]
269+
public async Task GetParameterValueReturnsCorrectlyWithComparisonTypeAsync()
270+
{
271+
using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
272+
{
273+
var parser = await MultipartFormDataParser.ParseAsync(stream, "boundry", Encoding.UTF8);
274+
Assert.NotNull(parser.GetParameterValue("text",StringComparison.OrdinalIgnoreCase));
275+
Assert.NotNull(parser.GetParameterValue("Text",StringComparison.OrdinalIgnoreCase));
276+
}
277+
}
278+
234279
[Fact]
235280
public void CanDetectBoundriesWithNewLineInNextBuffer()
236281
{

Source/HttpMultipartParser/Extensions.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
using System.Collections.Generic;
23
using System.Linq;
34

@@ -28,22 +29,24 @@ public static bool HasParameter(this IMultipartFormDataParser parser, string nam
2829
/// </summary>
2930
/// <param name="parser">The multipart form parser.</param>
3031
/// <param name="name">The name of the parameter.</param>
32+
/// <param name="comparisonType">One of the enumeration values that specifies how the strings will be compared.</param>
3133
/// <returns>The value of the parameter.</returns>
32-
public static string GetParameterValue(this IMultipartFormDataParser parser, string name)
34+
public static string GetParameterValue(this IMultipartFormDataParser parser, string name, StringComparison comparisonType = StringComparison.Ordinal)
3335
{
34-
return parser.GetParameterValues(name).FirstOrDefault();
36+
return parser.GetParameterValues(name, comparisonType).FirstOrDefault();
3537
}
3638

3739
/// <summary>
3840
/// Returns the values of a parameter or an empty enumerable if the parameter doesn't exist.
3941
/// </summary>
4042
/// <param name="parser">The multipart form parser.</param>
4143
/// <param name="name">The name of the parameter.</param>
44+
/// <param name="comparisonType">One of the enumeration values that specifies how the strings will be compared.</param>
4245
/// <returns>The values of the parameter.</returns>
43-
public static IEnumerable<string> GetParameterValues(this IMultipartFormDataParser parser, string name)
46+
public static IEnumerable<string> GetParameterValues(this IMultipartFormDataParser parser, string name, StringComparison comparisonType = StringComparison.Ordinal)
4447
{
4548
return parser.Parameters
46-
.Where(p => p.Name == name)
49+
.Where(p => p.Name.Equals(name, comparisonType))
4750
.Select(p => p.Data);
4851
}
4952
}

Source/HttpMultipartParser/HttpMultipartParser.csproj

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

33
<PropertyGroup>
4-
<TargetFrameworks>net461;net472;netstandard2.0;net5.0</TargetFrameworks>
4+
<TargetFrameworks>net48;netstandard2.1;net5.0;net6.0</TargetFrameworks>
5+
<LangVersion>preview</LangVersion>
56
<PlatformTarget>anycpu</PlatformTarget>
67
<GenerateDocumentationFile>true</GenerateDocumentationFile>
78
<OutputType>Library</OutputType>
@@ -13,6 +14,8 @@
1314
<PublishRepositoryUrl>true</PublishRepositoryUrl>
1415
<IncludeSymbols>true</IncludeSymbols>
1516
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
17+
<EmbedUntrackedSources>true</EmbedUntrackedSources>
18+
<PackageReadmeFile>README.md</PackageReadmeFile>
1619
</PropertyGroup>
1720

1821
<PropertyGroup>
@@ -56,6 +59,10 @@
5659
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
5760
</PropertyGroup>
5861

62+
<ItemGroup>
63+
<None Include="..\..\README.md" Pack="true" PackagePath="" />
64+
</ItemGroup>
65+
5966
<ItemGroup>
6067
<AdditionalFiles Include="$(SolutionDir)stylecop.json" Link="stylecop.json" />
6168
</ItemGroup>

appveyor.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ branches:
3636

3737
# Build cache
3838
cache:
39-
- tools -> build.cake
39+
- .cake -> build.cake
4040

4141
# Environment configuration
4242
image:

build.cake

Lines changed: 77 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
// Install tools.
2-
#tool dotnet:?package=GitVersion.Tool&version=5.8.2
2+
#tool dotnet:?package=GitVersion.Tool&version=5.10.3
3+
#tool dotnet:?package=coveralls.net&version=4.0.0
34
#tool nuget:?package=GitReleaseManager&version=0.13.0
4-
#tool nuget:?package=OpenCover&version=4.7.1221
5-
#tool nuget:?package=ReportGenerator&version=5.0.4
6-
#tool nuget:?package=coveralls.io&version=1.4.2
5+
#tool nuget:?package=ReportGenerator&version=5.1.9
76
#tool nuget:?package=xunit.runner.console&version=2.4.1
7+
#tool nuget:?package=Codecov&version=1.13.0
88

99
// Install addins.
1010
#addin nuget:?package=Cake.Coveralls&version=1.1.0
1111
#addin nuget:?package=Cake.Git&version=2.0.0
12+
#addin nuget:?package=Cake.Codecov&version=1.0.1
1213

1314

1415
///////////////////////////////////////////////////////////////////////////////
@@ -28,9 +29,24 @@ if (IsRunningOnUnix()) target = "Run-Unit-Tests";
2829
var libraryName = "HttpMultipartParser";
2930
var gitHubRepo = "Http-Multipart-Data-Parser";
3031

31-
var testCoverageFilter = "+[HttpMultipartParser]* -[HttpMultipartParser]HttpMultipartParser.Properties.* -[HttpMultipartParser]HttpMultipartParser.Models.*";
32-
var testCoverageExcludeByAttribute = "*.ExcludeFromCodeCoverage*";
33-
var testCoverageExcludeByFile = "*/*Designer.cs;*/*AssemblyInfo.cs";
32+
var testCoverageFilters = new[]
33+
{
34+
"+[HttpMultipartParser]*",
35+
"-[HttpMultipartParser]HttpMultipartParser.Properties.*",
36+
"-[HttpMultipartParser]HttpMultipartParser.Models.*",
37+
"-[HttpMultipartParser]*System.Text.Json.SourceGeneration*"
38+
};
39+
var testCoverageExcludeAttributes = new[]
40+
{
41+
"Obsolete",
42+
"GeneratedCodeAttribute",
43+
"CompilerGeneratedAttribute",
44+
"ExcludeFromCodeCoverageAttribute"
45+
};
46+
var testCoverageExcludeFiles = new[]
47+
{
48+
"**/AssemblyInfo.cs"
49+
};
3450

3551
var nuGetApiUrl = Argument<string>("NUGET_API_URL", EnvironmentVariable("NUGET_API_URL"));
3652
var nuGetApiKey = Argument<string>("NUGET_API_KEY", EnvironmentVariable("NUGET_API_KEY"));
@@ -43,6 +59,9 @@ var gitHubUserName = Argument<string>("GITHUB_USERNAME", EnvironmentVariable("GI
4359
var gitHubPassword = Argument<string>("GITHUB_PASSWORD", EnvironmentVariable("GITHUB_PASSWORD"));
4460
var gitHubRepoOwner = Argument<string>("GITHUB_REPOOWNER", EnvironmentVariable("GITHUB_REPOOWNER") ?? gitHubUserName);
4561

62+
var coverallsToken = Argument<string>("COVERALLS_REPO_TOKEN", EnvironmentVariable("COVERALLS_REPO_TOKEN"));
63+
var codecovToken = Argument<string>("CODECOV_TOKEN", EnvironmentVariable("CODECOV_TOKEN"));
64+
4665
var sourceFolder = "./Source/";
4766
var outputDir = "./artifacts/";
4867
var codeCoverageDir = $"{outputDir}CodeCoverage/";
@@ -72,7 +91,14 @@ var isBenchmarkProjectPresent = FileExists(benchmarkProject);
7291
// - when running unit tests on Ubuntu
7392
// - when calculating code coverage
7493
// FYI, this will cause an error if the source project and/or the unit test project are not configured to target this desired framework:
75-
var desiredFramework = IsRunningOnWindows() ? null : "net5.0";
94+
const string DefaultFramework = "net6.0";
95+
var desiredFramework = (
96+
!IsRunningOnWindows() ||
97+
target.Equals("Coverage", StringComparison.OrdinalIgnoreCase) ||
98+
target.Equals("Run-Code-Coverage", StringComparison.OrdinalIgnoreCase) ||
99+
target.Equals("Generate-Code-Coverage-Report", StringComparison.OrdinalIgnoreCase) ||
100+
target.Equals("Upload-Coverage-Result", StringComparison.OrdinalIgnoreCase)
101+
) ? DefaultFramework : null;
76102

77103

78104
///////////////////////////////////////////////////////////////////////////////
@@ -225,7 +251,7 @@ Task("Build")
225251
AssemblyVersion = versionInfo.MajorMinorPatch,
226252
FileVersion = versionInfo.MajorMinorPatch,
227253
InformationalVersion = versionInfo.InformationalVersion,
228-
ContinuousIntegrationBuild = !BuildSystem.IsLocalBuild
254+
ContinuousIntegrationBuild = true
229255
}
230256
});
231257
});
@@ -247,26 +273,26 @@ Task("Run-Code-Coverage")
247273
.IsDependentOn("Build")
248274
.Does(() =>
249275
{
250-
Action<ICakeContext> testAction = ctx => ctx.DotNetTest(unitTestsProject, new DotNetTestSettings
276+
var testSettings = new DotNetTestSettings
251277
{
252278
NoBuild = true,
253279
NoRestore = true,
254280
Configuration = configuration,
255-
Framework = desiredFramework
256-
});
257-
258-
OpenCover(testAction,
259-
$"{codeCoverageDir}coverage.xml",
260-
new OpenCoverSettings
261-
{
262-
OldStyle = true,
263-
MergeOutput = true,
264-
ArgumentCustomization = args => args.Append("-returntargetcode")
265-
}
266-
.WithFilter(testCoverageFilter)
267-
.ExcludeByAttribute(testCoverageExcludeByAttribute)
268-
.ExcludeByFile(testCoverageExcludeByFile)
269-
);
281+
Framework = DefaultFramework,
282+
283+
// The following assumes that coverlet.msbuild has been added to the unit testing project
284+
ArgumentCustomization = args => args
285+
.Append("/p:CollectCoverage=true")
286+
.Append("/p:CoverletOutputFormat=opencover")
287+
.Append($"/p:CoverletOutput={MakeAbsolute(Directory(codeCoverageDir))}/coverage.xml") // The name of the framework will be inserted between "coverage" and "xml". This is important to know when uploading the XML file to coveralls/codecov and when generating the HTML report
288+
.Append($"/p:ExcludeByAttribute={string.Join("%2c", testCoverageExcludeAttributes)}")
289+
.Append($"/p:ExcludeByFile={string.Join("%2c", testCoverageExcludeFiles)}")
290+
.Append($"/p:Exclude={string.Join("%2c", testCoverageFilters.Where(filter => filter.StartsWith("-")).Select(filter => filter.TrimStart("-", StringComparison.OrdinalIgnoreCase)))}")
291+
.Append($"/p:Include={string.Join("%2c", testCoverageFilters.Where(filter => filter.StartsWith("+")).Select(filter => filter.TrimStart("+", StringComparison.OrdinalIgnoreCase)))}")
292+
.Append("/p:SkipAutoProps=true")
293+
};
294+
295+
DotNetTest(unitTestsProject, testSettings);
270296
});
271297

272298
Task("Upload-Coverage-Result")
@@ -275,7 +301,19 @@ Task("Upload-Coverage-Result")
275301
{
276302
try
277303
{
278-
CoverallsIo($"{codeCoverageDir}coverage.xml");
304+
CoverallsNet(new FilePath($"{codeCoverageDir}coverage.{DefaultFramework}.xml"), CoverallsNetReportType.OpenCover, new CoverallsNetSettings()
305+
{
306+
RepoToken = coverallsToken
307+
});
308+
}
309+
catch (Exception e)
310+
{
311+
Warning(e.Message);
312+
}
313+
314+
try
315+
{
316+
Codecov($"{codeCoverageDir}coverage.{DefaultFramework}.xml", codecovToken);
279317
}
280318
catch (Exception e)
281319
{
@@ -288,7 +326,7 @@ Task("Generate-Code-Coverage-Report")
288326
.Does(() =>
289327
{
290328
ReportGenerator(
291-
new FilePath($"{codeCoverageDir}coverage.xml"),
329+
new FilePath($"{codeCoverageDir}coverage.{DefaultFramework}.xml"),
292330
codeCoverageDir,
293331
new ReportGeneratorSettings() {
294332
ClassFilters = new[] { "*.UnitTests*" }
@@ -381,20 +419,19 @@ Task("Publish-MyGet")
381419
Task("Create-Release-Notes")
382420
.Does(() =>
383421
{
384-
var settings = new GitReleaseManagerCreateSettings
385-
{
386-
Name = milestone,
387-
Milestone = milestone,
388-
Prerelease = false,
389-
TargetCommitish = "main"
390-
};
391-
392422
if (string.IsNullOrEmpty(gitHubToken))
393423
{
394424
throw new InvalidOperationException("GitHub token was not provided.");
395425
}
396426

397-
GitReleaseManagerCreate(gitHubToken, gitHubRepoOwner, gitHubRepo, settings);
427+
GitReleaseManagerCreate(gitHubToken, gitHubRepoOwner, gitHubRepo, new GitReleaseManagerCreateSettings
428+
{
429+
Name = milestone,
430+
Milestone = milestone,
431+
Prerelease = false,
432+
TargetCommitish = "main",
433+
Verbose = true
434+
});
398435
});
399436

400437
Task("Publish-GitHub-Release")
@@ -410,7 +447,10 @@ Task("Publish-GitHub-Release")
410447
throw new InvalidOperationException("GitHub token was not provided.");
411448
}
412449

413-
GitReleaseManagerClose(gitHubToken, gitHubRepoOwner, gitHubRepo, milestone);
450+
GitReleaseManagerClose(gitHubToken, gitHubRepoOwner, gitHubRepo, milestone, new GitReleaseManagerCloseMilestoneSettings
451+
{
452+
Verbose = true
453+
});
414454
});
415455

416456
Task("Generate-Benchmark-Report")

0 commit comments

Comments
 (0)