mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-06-12 17:54:27 +02:00
Fixed "Content-Type multipart/form-data" (#249)
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<VersionPrefix>1.0.6</VersionPrefix>
|
<VersionPrefix>1.0.6.1</VersionPrefix>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<Choose>
|
<Choose>
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
https://github.com/StefH/GitHubReleaseNotes
|
https://github.com/StefH/GitHubReleaseNotes
|
||||||
|
|
||||||
GitHubReleaseNotes.exe --output CHANGELOG.md --skip-empty-releases --version 1.0.6
|
GitHubReleaseNotes.exe --output CHANGELOG.md --skip-empty-releases --version 1.0.6.1
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
using System;
|
using JetBrains.Annotations;
|
||||||
|
using MimeKit;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using JetBrains.Annotations;
|
|
||||||
using MimeKit;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using WireMock.Matchers;
|
using WireMock.Matchers;
|
||||||
using WireMock.Validation;
|
using WireMock.Validation;
|
||||||
|
|
||||||
@@ -28,6 +28,10 @@ namespace WireMock.Util
|
|||||||
*/
|
*/
|
||||||
private static readonly string[] AllowedBodyParseMethods = { "PUT", "POST", "OPTIONS", "PATCH" };
|
private static readonly string[] AllowedBodyParseMethods = { "PUT", "POST", "OPTIONS", "PATCH" };
|
||||||
|
|
||||||
|
private static readonly IStringMatcher[] MultipartContentTypesMatchers = {
|
||||||
|
new WildcardMatcher("multipart/*", true)
|
||||||
|
};
|
||||||
|
|
||||||
private static readonly IStringMatcher[] JsonContentTypesMatchers = {
|
private static readonly IStringMatcher[] JsonContentTypesMatchers = {
|
||||||
new WildcardMatcher("application/json", true),
|
new WildcardMatcher("application/json", true),
|
||||||
new WildcardMatcher("application/vnd.*+json", true)
|
new WildcardMatcher("application/vnd.*+json", true)
|
||||||
@@ -68,6 +72,11 @@ namespace WireMock.Util
|
|||||||
return BodyType.Json;
|
return BodyType.Json;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (MultipartContentTypesMatchers.Any(matcher => MatchScores.IsPerfect(matcher.IsMatch(contentType.MimeType))))
|
||||||
|
{
|
||||||
|
return BodyType.MultiPart;
|
||||||
|
}
|
||||||
|
|
||||||
return BodyType.Bytes;
|
return BodyType.Bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,6 +91,12 @@ namespace WireMock.Util
|
|||||||
DetectedBodyTypeFromContentType = DetectBodyTypeFromContentType(contentType)
|
DetectedBodyTypeFromContentType = DetectBodyTypeFromContentType(contentType)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// In case of MultiPart: never try to read as String but keep as-is
|
||||||
|
if (data.DetectedBodyTypeFromContentType == BodyType.MultiPart)
|
||||||
|
{
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
// Try to get the body as String
|
// Try to get the body as String
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -28,6 +28,11 @@
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Body is a File
|
/// Body is a File
|
||||||
/// </summary>
|
/// </summary>
|
||||||
File
|
File,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Body is a MultiPart
|
||||||
|
/// </summary>
|
||||||
|
MultiPart
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
using System.IO;
|
using NFluent;
|
||||||
|
using System.IO;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using NFluent;
|
|
||||||
using WireMock.Util;
|
using WireMock.Util;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
@@ -17,7 +17,7 @@ namespace WireMock.Net.Tests.Util
|
|||||||
[InlineData("application/vnd.test+json", "{ \"x\": 1 }", BodyType.Json, BodyType.Json)]
|
[InlineData("application/vnd.test+json", "{ \"x\": 1 }", BodyType.Json, BodyType.Json)]
|
||||||
public async Task BodyParser_Parse_ContentTypeJson(string contentType, string bodyAsJson, BodyType detectedBodyType, BodyType detectedBodyTypeFromContentType)
|
public async Task BodyParser_Parse_ContentTypeJson(string contentType, string bodyAsJson, BodyType detectedBodyType, BodyType detectedBodyTypeFromContentType)
|
||||||
{
|
{
|
||||||
// Assign
|
// Arrange
|
||||||
var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(bodyAsJson));
|
var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(bodyAsJson));
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
@@ -36,7 +36,7 @@ namespace WireMock.Net.Tests.Util
|
|||||||
[InlineData("something", "hello", BodyType.String, BodyType.Bytes)]
|
[InlineData("something", "hello", BodyType.String, BodyType.Bytes)]
|
||||||
public async Task BodyParser_Parse_ContentTypeString(string contentType, string bodyAsString, BodyType detectedBodyType, BodyType detectedBodyTypeFromContentType)
|
public async Task BodyParser_Parse_ContentTypeString(string contentType, string bodyAsString, BodyType detectedBodyType, BodyType detectedBodyTypeFromContentType)
|
||||||
{
|
{
|
||||||
// Assign
|
// Arrange
|
||||||
var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(bodyAsString));
|
var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(bodyAsString));
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
@@ -50,11 +50,49 @@ namespace WireMock.Net.Tests.Util
|
|||||||
Check.That(body.DetectedBodyTypeFromContentType).IsEqualTo(detectedBodyTypeFromContentType);
|
Check.That(body.DetectedBodyTypeFromContentType).IsEqualTo(detectedBodyTypeFromContentType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task BodyParser_Parse_ContentTypeMultipart()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
string contentType = "multipart/form-data";
|
||||||
|
string body = @"
|
||||||
|
|
||||||
|
-----------------------------9051914041544843365972754266
|
||||||
|
Content-Disposition: form-data; name=""text""
|
||||||
|
|
||||||
|
text default
|
||||||
|
-----------------------------9051914041544843365972754266
|
||||||
|
Content-Disposition: form-data; name=""file1""; filename=""a.txt""
|
||||||
|
Content-Type: text/plain
|
||||||
|
|
||||||
|
Content of a txt
|
||||||
|
|
||||||
|
-----------------------------9051914041544843365972754266
|
||||||
|
Content-Disposition: form-data; name=""file2""; filename=""a.html""
|
||||||
|
Content-Type: text/html
|
||||||
|
|
||||||
|
<!DOCTYPE html><title>Content of a.html.</title>
|
||||||
|
|
||||||
|
-----------------------------9051914041544843365972754266--";
|
||||||
|
|
||||||
|
var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(body));
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = await BodyParser.Parse(memoryStream, contentType);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Check.That(result.DetectedBodyType).IsEqualTo(BodyType.Bytes);
|
||||||
|
Check.That(result.DetectedBodyTypeFromContentType).IsEqualTo(BodyType.MultiPart);
|
||||||
|
Check.That(result.BodyAsBytes).IsNotNull();
|
||||||
|
Check.That(result.BodyAsJson).IsNull();
|
||||||
|
Check.That(result.BodyAsString).IsNull();
|
||||||
|
}
|
||||||
|
|
||||||
[Theory]
|
[Theory]
|
||||||
[InlineData(null, "hello", BodyType.String, BodyType.Bytes)]
|
[InlineData(null, "hello", BodyType.String, BodyType.Bytes)]
|
||||||
public async Task BodyParser_Parse_ContentTypeIsNull(string contentType, string bodyAsString, BodyType detectedBodyType, BodyType detectedBodyTypeFromContentType)
|
public async Task BodyParser_Parse_ContentTypeIsNull(string contentType, string bodyAsString, BodyType detectedBodyType, BodyType detectedBodyTypeFromContentType)
|
||||||
{
|
{
|
||||||
// Assign
|
// Arrange
|
||||||
var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(bodyAsString));
|
var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(bodyAsString));
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|||||||
Reference in New Issue
Block a user