mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-06-09 00:12:48 +02:00
Add DeserializeFormUrl Encoded to the settings (#905)
* Add DeserializeFormUrlEncoded to Settings * EmptyArray<>.Value * .
This commit is contained in:
@@ -31,27 +31,49 @@ public class SettingsModel
|
|||||||
public int? MaxRequestLogCount { get; set; }
|
public int? MaxRequestLogCount { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Allow a Body for all HTTP Methods. (default set to false).
|
/// Allow a Body for all HTTP Methods. (default set to <c>false</c>).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool? AllowBodyForAllHttpMethods { get; set; }
|
public bool? AllowBodyForAllHttpMethods { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Handle all requests synchronously. (default set to false).
|
/// Allow only a HttpStatus Code in the response which is defined. (default set to <c>false</c>).
|
||||||
|
/// - false : also null, 0, empty or invalid HttpStatus codes are allowed.
|
||||||
|
/// - true : only codes defined in <see cref="System.Net.HttpStatusCode"/> are allowed.
|
||||||
|
/// </summary>
|
||||||
|
public bool? AllowOnlyDefinedHttpStatusCodeInResponse { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set to true to disable Json deserialization when processing requests. (default set to <c>false</c>).
|
||||||
|
/// </summary>
|
||||||
|
public bool? DisableJsonBodyParsing { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Disable support for GZip and Deflate request body decompression. (default set to <c>false</c>).
|
||||||
|
/// </summary>
|
||||||
|
public bool? DisableRequestBodyDecompressing { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set to true to disable FormUrlEncoded deserializing when processing requests. (default set to <c>false</c>).
|
||||||
|
/// </summary>
|
||||||
|
public bool? DisableDeserializeFormUrlEncoded { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handle all requests synchronously. (default set to <c>false</c>).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool? HandleRequestsSynchronously { get; set; }
|
public bool? HandleRequestsSynchronously { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Throw an exception when the Matcher fails because of invalid input. (default set to false).
|
/// Throw an exception when the Matcher fails because of invalid input. (default set to <c>false</c>).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool? ThrowExceptionWhenMatcherFails { get; set; }
|
public bool? ThrowExceptionWhenMatcherFails { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Use the RegexExtended instead of the default <see cref="Regex"/>. (default set to true).
|
/// Use the RegexExtended instead of the default <see cref="Regex"/>. (default set to <c>true</c>).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool? UseRegexExtended { get; set; }
|
public bool? UseRegexExtended { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Save unmatched requests to a file using the <see cref="IFileSystemHandler"/>. (default set to false).
|
/// Save unmatched requests to a file using the <see cref="IFileSystemHandler"/>. (default set to <c>false</c>).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool? SaveUnmatchedRequests { get; set; }
|
public bool? SaveUnmatchedRequests { get; set; }
|
||||||
|
|
||||||
@@ -86,7 +108,7 @@ public class SettingsModel
|
|||||||
public HostingScheme? HostingScheme { get; set; }
|
public HostingScheme? HostingScheme { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Don't save the response-string in the LogEntry when WithBody(Func{IRequestMessage, string}) or WithBody(Func{IRequestMessage, Task{string}}) is used. (default set to false).
|
/// Don't save the response-string in the LogEntry when WithBody(Func{IRequestMessage, string}) or WithBody(Func{IRequestMessage, Task{string}}) is used. (default set to <c>false</c>).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool? DoNotSaveDynamicResponseInLogEntry { get; set; }
|
public bool? DoNotSaveDynamicResponseInLogEntry { get; set; }
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ internal static class HttpResponseMessageHelper
|
|||||||
Uri requiredUri,
|
Uri requiredUri,
|
||||||
Uri originalUri,
|
Uri originalUri,
|
||||||
bool deserializeJson,
|
bool deserializeJson,
|
||||||
bool decompressGzipAndDeflate)
|
bool decompressGzipAndDeflate,
|
||||||
|
bool deserializeFormUrlEncoded)
|
||||||
{
|
{
|
||||||
var responseMessage = new ResponseMessage { StatusCode = (int)httpResponseMessage.StatusCode };
|
var responseMessage = new ResponseMessage { StatusCode = (int)httpResponseMessage.StatusCode };
|
||||||
|
|
||||||
@@ -44,7 +45,8 @@ internal static class HttpResponseMessageHelper
|
|||||||
ContentType = contentTypeHeader?.FirstOrDefault(),
|
ContentType = contentTypeHeader?.FirstOrDefault(),
|
||||||
DeserializeJson = deserializeJson,
|
DeserializeJson = deserializeJson,
|
||||||
ContentEncoding = contentEncodingHeader?.FirstOrDefault(),
|
ContentEncoding = contentEncodingHeader?.FirstOrDefault(),
|
||||||
DecompressGZipAndDeflate = decompressGzipAndDeflate
|
DecompressGZipAndDeflate = decompressGzipAndDeflate,
|
||||||
|
DeserializeFormUrlEncoded = deserializeFormUrlEncoded
|
||||||
};
|
};
|
||||||
responseMessage.BodyData = await BodyParser.ParseAsync(bodyParserSettings).ConfigureAwait(false);
|
responseMessage.BodyData = await BodyParser.ParseAsync(bodyParserSettings).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
@@ -55,7 +57,7 @@ internal static class HttpResponseMessageHelper
|
|||||||
// If Location header contains absolute redirect URL, and base URL is one that we proxy to,
|
// If Location header contains absolute redirect URL, and base URL is one that we proxy to,
|
||||||
// we need to replace it to original one.
|
// we need to replace it to original one.
|
||||||
if (string.Equals(header.Key, HttpKnownHeaderNames.Location, StringComparison.OrdinalIgnoreCase)
|
if (string.Equals(header.Key, HttpKnownHeaderNames.Location, StringComparison.OrdinalIgnoreCase)
|
||||||
&& Uri.TryCreate(header.Value.First(), UriKind.Absolute, out Uri absoluteLocationUri)
|
&& Uri.TryCreate(header.Value.First(), UriKind.Absolute, out var absoluteLocationUri)
|
||||||
&& string.Equals(absoluteLocationUri.Host, requiredUri.Host, StringComparison.OrdinalIgnoreCase))
|
&& string.Equals(absoluteLocationUri.Host, requiredUri.Host, StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
var replacedLocationUri = new Uri(originalUri, absoluteLocationUri.PathAndQuery);
|
var replacedLocationUri = new Uri(originalUri, absoluteLocationUri.PathAndQuery);
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ internal static class JObjectExtensions
|
|||||||
{
|
{
|
||||||
if (src == null)
|
if (src == null)
|
||||||
{
|
{
|
||||||
return new object?[0];
|
return EmptyArray<object?>.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ConvertJTokenArray(src, options);
|
return ConvertJTokenArray(src, options);
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using AnyOfTypes;
|
using AnyOfTypes;
|
||||||
using WireMock.Models;
|
using WireMock.Models;
|
||||||
@@ -62,7 +63,7 @@ public class NotNullOrEmptyMatcher : IObjectMatcher, IStringMatcher
|
|||||||
/// <inheritdoc cref="IStringMatcher.GetPatterns"/>
|
/// <inheritdoc cref="IStringMatcher.GetPatterns"/>
|
||||||
public AnyOf<string, StringPattern>[] GetPatterns()
|
public AnyOf<string, StringPattern>[] GetPatterns()
|
||||||
{
|
{
|
||||||
return new AnyOf<string, StringPattern>[0];
|
return EmptyArray<AnyOf<string, StringPattern>>.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
|||||||
@@ -45,8 +45,16 @@ internal class ProxyHelper
|
|||||||
// Create ResponseMessage
|
// Create ResponseMessage
|
||||||
bool deserializeJson = !_settings.DisableJsonBodyParsing.GetValueOrDefault(false);
|
bool deserializeJson = !_settings.DisableJsonBodyParsing.GetValueOrDefault(false);
|
||||||
bool decompressGzipAndDeflate = !_settings.DisableRequestBodyDecompressing.GetValueOrDefault(false);
|
bool decompressGzipAndDeflate = !_settings.DisableRequestBodyDecompressing.GetValueOrDefault(false);
|
||||||
|
bool deserializeFormUrlEncoded = !_settings.DisableDeserializeFormUrlEncoded.GetValueOrDefault(false);
|
||||||
|
|
||||||
var responseMessage = await HttpResponseMessageHelper.CreateAsync(httpResponseMessage, requiredUri, originalUri, deserializeJson, decompressGzipAndDeflate).ConfigureAwait(false);
|
var responseMessage = await HttpResponseMessageHelper.CreateAsync(
|
||||||
|
httpResponseMessage,
|
||||||
|
requiredUri,
|
||||||
|
originalUri,
|
||||||
|
deserializeJson,
|
||||||
|
decompressGzipAndDeflate,
|
||||||
|
deserializeFormUrlEncoded
|
||||||
|
).ConfigureAwait(false);
|
||||||
|
|
||||||
IMapping? newMapping = null;
|
IMapping? newMapping = null;
|
||||||
|
|
||||||
@@ -56,11 +64,11 @@ internal class ProxyHelper
|
|||||||
if (saveMappingSettings != null)
|
if (saveMappingSettings != null)
|
||||||
{
|
{
|
||||||
save &= Check(saveMappingSettings.StatusCodePattern,
|
save &= Check(saveMappingSettings.StatusCodePattern,
|
||||||
() => HttpStatusRangeParser.IsMatch(saveMappingSettings.StatusCodePattern, responseMessage.StatusCode)
|
() => saveMappingSettings.StatusCodePattern != null && HttpStatusRangeParser.IsMatch(saveMappingSettings.StatusCodePattern, responseMessage.StatusCode)
|
||||||
);
|
);
|
||||||
|
|
||||||
save &= Check(saveMappingSettings.HttpMethods,
|
save &= Check(saveMappingSettings.HttpMethods,
|
||||||
() => saveMappingSettings.HttpMethods.Value.Contains(requestMessage.Method, StringComparer.OrdinalIgnoreCase)
|
() => saveMappingSettings.HttpMethods != null && saveMappingSettings.HttpMethods.Value.Contains(requestMessage.Method, StringComparer.OrdinalIgnoreCase)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -140,7 +140,7 @@ internal class MappingConverter
|
|||||||
{
|
{
|
||||||
sb.AppendLine($" .WithDelay({response.Delay.Value.TotalMilliseconds})");
|
sb.AppendLine($" .WithDelay({response.Delay.Value.TotalMilliseconds})");
|
||||||
}
|
}
|
||||||
else if (response.MinimumDelayMilliseconds > 0 && response.MaximumDelayMilliseconds > 0)
|
else if (response is { MinimumDelayMilliseconds: > 0, MaximumDelayMilliseconds: > 0 })
|
||||||
{
|
{
|
||||||
sb.AppendLine($" .WithRandomDelay({response.MinimumDelayMilliseconds}, {response.MaximumDelayMilliseconds})");
|
sb.AppendLine($" .WithRandomDelay({response.MinimumDelayMilliseconds}, {response.MaximumDelayMilliseconds})");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -217,10 +217,17 @@ public partial class WireMockServer
|
|||||||
var model = new SettingsModel
|
var model = new SettingsModel
|
||||||
{
|
{
|
||||||
AllowBodyForAllHttpMethods = _settings.AllowBodyForAllHttpMethods,
|
AllowBodyForAllHttpMethods = _settings.AllowBodyForAllHttpMethods,
|
||||||
|
AllowOnlyDefinedHttpStatusCodeInResponse = _settings.AllowOnlyDefinedHttpStatusCodeInResponse,
|
||||||
AllowPartialMapping = _settings.AllowPartialMapping,
|
AllowPartialMapping = _settings.AllowPartialMapping,
|
||||||
|
DisableDeserializeFormUrlEncoded = _settings.DisableDeserializeFormUrlEncoded,
|
||||||
|
DisableJsonBodyParsing = _settings.DisableJsonBodyParsing,
|
||||||
|
DisableRequestBodyDecompressing = _settings.DisableRequestBodyDecompressing,
|
||||||
|
DoNotSaveDynamicResponseInLogEntry = _settings.DoNotSaveDynamicResponseInLogEntry,
|
||||||
GlobalProcessingDelay = (int?)_options.RequestProcessingDelay?.TotalMilliseconds,
|
GlobalProcessingDelay = (int?)_options.RequestProcessingDelay?.TotalMilliseconds,
|
||||||
HandleRequestsSynchronously = _settings.HandleRequestsSynchronously,
|
HandleRequestsSynchronously = _settings.HandleRequestsSynchronously,
|
||||||
|
HostingScheme = _settings.HostingScheme,
|
||||||
MaxRequestLogCount = _settings.MaxRequestLogCount,
|
MaxRequestLogCount = _settings.MaxRequestLogCount,
|
||||||
|
QueryParameterMultipleValueSupport = _settings.QueryParameterMultipleValueSupport,
|
||||||
ReadStaticMappings = _settings.ReadStaticMappings,
|
ReadStaticMappings = _settings.ReadStaticMappings,
|
||||||
RequestLogExpirationDuration = _settings.RequestLogExpirationDuration,
|
RequestLogExpirationDuration = _settings.RequestLogExpirationDuration,
|
||||||
SaveUnmatchedRequests = _settings.SaveUnmatchedRequests,
|
SaveUnmatchedRequests = _settings.SaveUnmatchedRequests,
|
||||||
@@ -228,14 +235,11 @@ public partial class WireMockServer
|
|||||||
UseRegexExtended = _settings.UseRegexExtended,
|
UseRegexExtended = _settings.UseRegexExtended,
|
||||||
WatchStaticMappings = _settings.WatchStaticMappings,
|
WatchStaticMappings = _settings.WatchStaticMappings,
|
||||||
WatchStaticMappingsInSubdirectories = _settings.WatchStaticMappingsInSubdirectories,
|
WatchStaticMappingsInSubdirectories = _settings.WatchStaticMappingsInSubdirectories,
|
||||||
HostingScheme = _settings.HostingScheme,
|
|
||||||
DoNotSaveDynamicResponseInLogEntry = _settings.DoNotSaveDynamicResponseInLogEntry,
|
|
||||||
QueryParameterMultipleValueSupport = _settings.QueryParameterMultipleValueSupport,
|
|
||||||
|
|
||||||
#if USE_ASPNETCORE
|
#if USE_ASPNETCORE
|
||||||
CorsPolicyOptions = _settings.CorsPolicyOptions?.ToString(),
|
AcceptAnyClientCertificate = _settings.AcceptAnyClientCertificate,
|
||||||
ClientCertificateMode = _settings.ClientCertificateMode,
|
ClientCertificateMode = _settings.ClientCertificateMode,
|
||||||
AcceptAnyClientCertificate = _settings.AcceptAnyClientCertificate
|
CorsPolicyOptions = _settings.CorsPolicyOptions?.ToString()
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -250,10 +254,16 @@ public partial class WireMockServer
|
|||||||
|
|
||||||
// _settings
|
// _settings
|
||||||
_settings.AllowBodyForAllHttpMethods = settings.AllowBodyForAllHttpMethods;
|
_settings.AllowBodyForAllHttpMethods = settings.AllowBodyForAllHttpMethods;
|
||||||
|
_settings.AllowOnlyDefinedHttpStatusCodeInResponse = settings.AllowOnlyDefinedHttpStatusCodeInResponse;
|
||||||
_settings.AllowPartialMapping = settings.AllowPartialMapping;
|
_settings.AllowPartialMapping = settings.AllowPartialMapping;
|
||||||
|
_settings.DisableDeserializeFormUrlEncoded = settings.DisableDeserializeFormUrlEncoded;
|
||||||
|
_settings.DisableJsonBodyParsing = settings.DisableJsonBodyParsing;
|
||||||
|
_settings.DisableRequestBodyDecompressing = settings.DisableRequestBodyDecompressing;
|
||||||
|
_settings.DoNotSaveDynamicResponseInLogEntry = settings.DoNotSaveDynamicResponseInLogEntry;
|
||||||
_settings.HandleRequestsSynchronously = settings.HandleRequestsSynchronously;
|
_settings.HandleRequestsSynchronously = settings.HandleRequestsSynchronously;
|
||||||
_settings.MaxRequestLogCount = settings.MaxRequestLogCount;
|
_settings.MaxRequestLogCount = settings.MaxRequestLogCount;
|
||||||
_settings.ProxyAndRecordSettings = TinyMapperUtils.Instance.Map(settings.ProxyAndRecordSettings);
|
_settings.ProxyAndRecordSettings = TinyMapperUtils.Instance.Map(settings.ProxyAndRecordSettings);
|
||||||
|
_settings.QueryParameterMultipleValueSupport = settings.QueryParameterMultipleValueSupport;
|
||||||
_settings.ReadStaticMappings = settings.ReadStaticMappings;
|
_settings.ReadStaticMappings = settings.ReadStaticMappings;
|
||||||
_settings.RequestLogExpirationDuration = settings.RequestLogExpirationDuration;
|
_settings.RequestLogExpirationDuration = settings.RequestLogExpirationDuration;
|
||||||
_settings.SaveUnmatchedRequests = settings.SaveUnmatchedRequests;
|
_settings.SaveUnmatchedRequests = settings.SaveUnmatchedRequests;
|
||||||
@@ -261,8 +271,6 @@ public partial class WireMockServer
|
|||||||
_settings.UseRegexExtended = settings.UseRegexExtended;
|
_settings.UseRegexExtended = settings.UseRegexExtended;
|
||||||
_settings.WatchStaticMappings = settings.WatchStaticMappings;
|
_settings.WatchStaticMappings = settings.WatchStaticMappings;
|
||||||
_settings.WatchStaticMappingsInSubdirectories = settings.WatchStaticMappingsInSubdirectories;
|
_settings.WatchStaticMappingsInSubdirectories = settings.WatchStaticMappingsInSubdirectories;
|
||||||
_settings.DoNotSaveDynamicResponseInLogEntry = settings.DoNotSaveDynamicResponseInLogEntry;
|
|
||||||
_settings.QueryParameterMultipleValueSupport = settings.QueryParameterMultipleValueSupport;
|
|
||||||
|
|
||||||
InitSettings(_settings);
|
InitSettings(_settings);
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ public class ProxySaveMappingSetting<T>
|
|||||||
{
|
{
|
||||||
public MatchBehaviour MatchBehaviour { get; } = MatchBehaviour.AcceptOnMatch;
|
public MatchBehaviour MatchBehaviour { get; } = MatchBehaviour.AcceptOnMatch;
|
||||||
|
|
||||||
public T Value { get; private set; }
|
public T Value { get; }
|
||||||
|
|
||||||
public ProxySaveMappingSetting(T value, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
|
public ProxySaveMappingSetting(T value, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
|
||||||
{
|
{
|
||||||
@@ -14,7 +14,7 @@ public class ProxySaveMappingSetting<T>
|
|||||||
MatchBehaviour = matchBehaviour;
|
MatchBehaviour = matchBehaviour;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static implicit operator ProxySaveMappingSetting<T>(T value) => new ProxySaveMappingSetting<T>(value);
|
public static implicit operator ProxySaveMappingSetting<T>(T value) => new(value);
|
||||||
|
|
||||||
public static implicit operator T(ProxySaveMappingSetting<T> @this) => @this.Value;
|
public static implicit operator T(ProxySaveMappingSetting<T> @this) => @this.Value;
|
||||||
}
|
}
|
||||||
@@ -32,7 +32,7 @@ internal class SimpleCommandLineParser
|
|||||||
}
|
}
|
||||||
else if (string.IsNullOrEmpty(currentName))
|
else if (string.IsNullOrEmpty(currentName))
|
||||||
{
|
{
|
||||||
Arguments[arg] = new string[0];
|
Arguments[arg] = EmptyArray<string>.Value;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -182,13 +182,13 @@ public class WireMockServerSettings
|
|||||||
public bool? AllowCSharpCodeMatcher { get; set; }
|
public bool? AllowCSharpCodeMatcher { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Allow a Body for all HTTP Methods. (default set to false).
|
/// Allow a Body for all HTTP Methods. (default set to <c>false</c>).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[PublicAPI]
|
[PublicAPI]
|
||||||
public bool? AllowBodyForAllHttpMethods { get; set; }
|
public bool? AllowBodyForAllHttpMethods { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Allow only a HttpStatus Code in the response which is defined. (default set to false).
|
/// Allow only a HttpStatus Code in the response which is defined. (default set to <c>false</c>).
|
||||||
/// - false : also null, 0, empty or invalid HttpStatus codes are allowed.
|
/// - false : also null, 0, empty or invalid HttpStatus codes are allowed.
|
||||||
/// - true : only codes defined in <see cref="System.Net.HttpStatusCode"/> are allowed.
|
/// - true : only codes defined in <see cref="System.Net.HttpStatusCode"/> are allowed.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -196,25 +196,31 @@ public class WireMockServerSettings
|
|||||||
public bool? AllowOnlyDefinedHttpStatusCodeInResponse { get; set; }
|
public bool? AllowOnlyDefinedHttpStatusCodeInResponse { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Set to true to disable Json deserialization when processing requests. (default set to false).
|
/// Set to true to disable Json deserialization when processing requests. (default set to <c>false</c>).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[PublicAPI]
|
[PublicAPI]
|
||||||
public bool? DisableJsonBodyParsing { get; set; }
|
public bool? DisableJsonBodyParsing { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Disable support for GZip and Deflate request body decompression. (default set to false).
|
/// Disable support for GZip and Deflate request body decompression. (default set to <c>false</c>).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[PublicAPI]
|
[PublicAPI]
|
||||||
public bool? DisableRequestBodyDecompressing { get; set; }
|
public bool? DisableRequestBodyDecompressing { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Handle all requests synchronously. (default set to false).
|
/// Set to true to disable FormUrlEncoded deserializing when processing requests. (default set to <c>false</c>).
|
||||||
|
/// </summary>
|
||||||
|
[PublicAPI]
|
||||||
|
public bool? DisableDeserializeFormUrlEncoded { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handle all requests synchronously. (default set to <c>false</c>).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[PublicAPI]
|
[PublicAPI]
|
||||||
public bool? HandleRequestsSynchronously { get; set; }
|
public bool? HandleRequestsSynchronously { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Throw an exception when the <see cref="IMatcher"/> fails because of invalid input. (default set to false).
|
/// Throw an exception when the <see cref="IMatcher"/> fails because of invalid input. (default set to <c>false</c>).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[PublicAPI]
|
[PublicAPI]
|
||||||
public bool? ThrowExceptionWhenMatcherFails { get; set; }
|
public bool? ThrowExceptionWhenMatcherFails { get; set; }
|
||||||
@@ -255,19 +261,19 @@ public class WireMockServerSettings
|
|||||||
public WebhookSettings? WebhookSettings { get; set; }
|
public WebhookSettings? WebhookSettings { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Use the <see cref="RegexExtended"/> instead of the default <see cref="Regex"/> (default set to true).
|
/// Use the <see cref="RegexExtended"/> instead of the default <see cref="Regex"/> (default set to <c>true</c>).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[PublicAPI]
|
[PublicAPI]
|
||||||
public bool? UseRegexExtended { get; set; } = true;
|
public bool? UseRegexExtended { get; set; } = true;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Save unmatched requests to a file using the <see cref="IFileSystemHandler"/> (default set to false).
|
/// Save unmatched requests to a file using the <see cref="IFileSystemHandler"/> (default set to <c>false</c>).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[PublicAPI]
|
[PublicAPI]
|
||||||
public bool? SaveUnmatchedRequests { get; set; }
|
public bool? SaveUnmatchedRequests { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Don't save the response-string in the LogEntry when WithBody(Func{IRequestMessage, string}) or WithBody(Func{IRequestMessage, Task{string}}) is used. (default set to false).
|
/// Don't save the response-string in the LogEntry when WithBody(Func{IRequestMessage, string}) or WithBody(Func{IRequestMessage, Task{string}}) is used. (default set to <c>false</c>).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[PublicAPI]
|
[PublicAPI]
|
||||||
public bool? DoNotSaveDynamicResponseInLogEntry { get; set; }
|
public bool? DoNotSaveDynamicResponseInLogEntry { get; set; }
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ using System.Linq;
|
|||||||
using JetBrains.Annotations;
|
using JetBrains.Annotations;
|
||||||
using Stef.Validation;
|
using Stef.Validation;
|
||||||
using WireMock.Logging;
|
using WireMock.Logging;
|
||||||
using WireMock.Matchers;
|
|
||||||
using WireMock.Types;
|
using WireMock.Types;
|
||||||
using WireMock.Util;
|
using WireMock.Util;
|
||||||
|
|
||||||
@@ -47,6 +46,8 @@ public static class WireMockServerSettingsParser
|
|||||||
AllowOnlyDefinedHttpStatusCodeInResponse = parser.GetBoolValue("AllowOnlyDefinedHttpStatusCodeInResponse"),
|
AllowOnlyDefinedHttpStatusCodeInResponse = parser.GetBoolValue("AllowOnlyDefinedHttpStatusCodeInResponse"),
|
||||||
AllowPartialMapping = parser.GetBoolValue("AllowPartialMapping"),
|
AllowPartialMapping = parser.GetBoolValue("AllowPartialMapping"),
|
||||||
DisableJsonBodyParsing = parser.GetBoolValue("DisableJsonBodyParsing"),
|
DisableJsonBodyParsing = parser.GetBoolValue("DisableJsonBodyParsing"),
|
||||||
|
DisableRequestBodyDecompressing = parser.GetBoolValue(nameof(WireMockServerSettings.DisableRequestBodyDecompressing)),
|
||||||
|
DisableDeserializeFormUrlEncoded = parser.GetBoolValue(nameof(WireMockServerSettings.DisableDeserializeFormUrlEncoded)),
|
||||||
HandleRequestsSynchronously = parser.GetBoolValue("HandleRequestsSynchronously"),
|
HandleRequestsSynchronously = parser.GetBoolValue("HandleRequestsSynchronously"),
|
||||||
MaxRequestLogCount = parser.GetIntValue("MaxRequestLogCount"),
|
MaxRequestLogCount = parser.GetIntValue("MaxRequestLogCount"),
|
||||||
ReadStaticMappings = parser.GetBoolValue("ReadStaticMappings"),
|
ReadStaticMappings = parser.GetBoolValue("ReadStaticMappings"),
|
||||||
|
|||||||
@@ -16,18 +16,14 @@ internal static class HttpStatusRangeParser
|
|||||||
/// <param name="pattern">The pattern. (Can be null, in that case it's allowed.)</param>
|
/// <param name="pattern">The pattern. (Can be null, in that case it's allowed.)</param>
|
||||||
/// <param name="httpStatusCode">The value.</param>
|
/// <param name="httpStatusCode">The value.</param>
|
||||||
/// <exception cref="ArgumentException"><paramref name="pattern"/> is invalid.</exception>
|
/// <exception cref="ArgumentException"><paramref name="pattern"/> is invalid.</exception>
|
||||||
public static bool IsMatch(string pattern, object? httpStatusCode)
|
public static bool IsMatch(string? pattern, object? httpStatusCode)
|
||||||
{
|
{
|
||||||
switch (httpStatusCode)
|
return httpStatusCode switch
|
||||||
{
|
{
|
||||||
case int statusCodeAsInteger:
|
int statusCodeAsInteger => IsMatch(pattern, statusCodeAsInteger),
|
||||||
return IsMatch(pattern, statusCodeAsInteger);
|
string statusCodeAsString => IsMatch(pattern, int.Parse(statusCodeAsString)),
|
||||||
|
_ => false
|
||||||
case string statusCodeAsString:
|
};
|
||||||
return IsMatch(pattern, int.Parse(statusCodeAsString));
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -36,14 +36,12 @@ internal static class RegexUtils
|
|||||||
{
|
{
|
||||||
if (useRegexExtended)
|
if (useRegexExtended)
|
||||||
{
|
{
|
||||||
var r = new RegexExtended(pattern, RegexOptions.None, RegexTimeOut);
|
var regexExtended = new RegexExtended(pattern, RegexOptions.None, RegexTimeOut);
|
||||||
return (true, r.IsMatch(input));
|
return (true, regexExtended.IsMatch(input));
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var r = new Regex(pattern, RegexOptions.None, RegexTimeOut);
|
|
||||||
return (true, r.IsMatch(input));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var regex = new Regex(pattern, RegexOptions.None, RegexTimeOut);
|
||||||
|
return (true, regex.IsMatch(input));
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,119 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Concurrent;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.Reflection.Emit;
|
|
||||||
|
|
||||||
namespace WireMock.Util;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Code based on https://stackoverflow.com/questions/40507909/convert-jobject-to-anonymous-object
|
|
||||||
/// </summary>
|
|
||||||
internal static class TypeBuilderUtils
|
|
||||||
{
|
|
||||||
private static readonly ConcurrentDictionary<IDictionary<string, Type>, Type> Types = new();
|
|
||||||
|
|
||||||
private static readonly ModuleBuilder ModuleBuilder = AssemblyBuilder
|
|
||||||
.DefineDynamicAssembly(new AssemblyName("WireMock.Net.Reflection"), AssemblyBuilderAccess.Run)
|
|
||||||
.DefineDynamicModule("WireMock.Net.Reflection.Module");
|
|
||||||
|
|
||||||
public static Type BuildType(IDictionary<string, Type> properties, string? name = null)
|
|
||||||
{
|
|
||||||
var keyExists = Types.Keys.FirstOrDefault(k => Compare(k, properties));
|
|
||||||
if (keyExists != null)
|
|
||||||
{
|
|
||||||
return Types[keyExists];
|
|
||||||
}
|
|
||||||
|
|
||||||
var typeBuilder = GetTypeBuilder(name ?? Guid.NewGuid().ToString());
|
|
||||||
foreach (var property in properties)
|
|
||||||
{
|
|
||||||
CreateGetSetMethods(typeBuilder, property.Key, property.Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
var type = typeBuilder.CreateTypeInfo()!.AsType();
|
|
||||||
|
|
||||||
Types.TryAdd(properties, type);
|
|
||||||
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// https://stackoverflow.com/questions/3804367/testing-for-equality-between-dictionaries-in-c-sharp
|
|
||||||
/// </summary>
|
|
||||||
private static bool Compare<TKey, TValue>(IDictionary<TKey, TValue> dict1, IDictionary<TKey, TValue> dict2)
|
|
||||||
where TKey : notnull
|
|
||||||
{
|
|
||||||
if (dict1 == dict2)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dict1.Count != dict2.Count)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
var valueComparer = EqualityComparer<TValue>.Default;
|
|
||||||
|
|
||||||
foreach (var kvp in dict1)
|
|
||||||
{
|
|
||||||
if (!dict2.TryGetValue(kvp.Key, out var value2))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!valueComparer.Equals(kvp.Value, value2))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static TypeBuilder GetTypeBuilder(string name)
|
|
||||||
{
|
|
||||||
return ModuleBuilder.DefineType(name,
|
|
||||||
TypeAttributes.Public |
|
|
||||||
TypeAttributes.Class |
|
|
||||||
TypeAttributes.AutoClass |
|
|
||||||
TypeAttributes.AnsiClass |
|
|
||||||
TypeAttributes.BeforeFieldInit |
|
|
||||||
TypeAttributes.AutoLayout,
|
|
||||||
null);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void CreateGetSetMethods(TypeBuilder typeBuilder, string propertyName, Type propertyType)
|
|
||||||
{
|
|
||||||
var fieldBuilder = typeBuilder.DefineField("_" + propertyName, propertyType, FieldAttributes.Private);
|
|
||||||
|
|
||||||
var propertyBuilder = typeBuilder.DefineProperty(propertyName, PropertyAttributes.HasDefault, propertyType, null);
|
|
||||||
|
|
||||||
var getPropertyMethodBuilder = typeBuilder.DefineMethod("get_" + propertyName, MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, propertyType, Type.EmptyTypes);
|
|
||||||
var getIl = getPropertyMethodBuilder.GetILGenerator();
|
|
||||||
|
|
||||||
getIl.Emit(OpCodes.Ldarg_0);
|
|
||||||
getIl.Emit(OpCodes.Ldfld, fieldBuilder);
|
|
||||||
getIl.Emit(OpCodes.Ret);
|
|
||||||
|
|
||||||
var setPropertyMethodBuilder = typeBuilder.DefineMethod("set_" + propertyName, MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, null, new[] { propertyType });
|
|
||||||
var setIl = setPropertyMethodBuilder.GetILGenerator();
|
|
||||||
var modifyProperty = setIl.DefineLabel();
|
|
||||||
|
|
||||||
var exitSet = setIl.DefineLabel();
|
|
||||||
|
|
||||||
setIl.MarkLabel(modifyProperty);
|
|
||||||
setIl.Emit(OpCodes.Ldarg_0);
|
|
||||||
setIl.Emit(OpCodes.Ldarg_1);
|
|
||||||
setIl.Emit(OpCodes.Stfld, fieldBuilder);
|
|
||||||
|
|
||||||
setIl.Emit(OpCodes.Nop);
|
|
||||||
setIl.MarkLabel(exitSet);
|
|
||||||
setIl.Emit(OpCodes.Ret);
|
|
||||||
|
|
||||||
propertyBuilder.SetGetMethod(getPropertyMethodBuilder);
|
|
||||||
propertyBuilder.SetSetMethod(setPropertyMethodBuilder);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
using System;
|
|
||||||
|
|
||||||
namespace WireMock.Validation
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// To fix 'xxx' is null on at least one execution path. See also https://rules.sonarsource.com/csharp/RSPEC-3900.
|
|
||||||
/// </summary>
|
|
||||||
internal class ValidatedNotNullAttribute : Attribute
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using System;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using NFluent;
|
using NFluent;
|
||||||
using WireMock.Matchers;
|
using WireMock.Matchers;
|
||||||
@@ -37,7 +38,7 @@ public class JmesPathMatcherTests
|
|||||||
public void JmesPathMatcher_IsMatch_ByteArray()
|
public void JmesPathMatcher_IsMatch_ByteArray()
|
||||||
{
|
{
|
||||||
// Assign
|
// Assign
|
||||||
var bytes = new byte[0];
|
var bytes = EmptyArray<byte>.Value;
|
||||||
var matcher = new JmesPathMatcher("");
|
var matcher = new JmesPathMatcher("");
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ public class JsonMatcherTests
|
|||||||
public void JsonMatcher_IsMatch_ByteArray()
|
public void JsonMatcher_IsMatch_ByteArray()
|
||||||
{
|
{
|
||||||
// Assign
|
// Assign
|
||||||
var bytes = new byte[0];
|
var bytes = EmptyArray<byte>.Value;
|
||||||
var matcher = new JsonMatcher("");
|
var matcher = new JsonMatcher("");
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ public class JsonPartialMatcherTests
|
|||||||
public void JsonPartialMatcher_IsMatch_ByteArray()
|
public void JsonPartialMatcher_IsMatch_ByteArray()
|
||||||
{
|
{
|
||||||
// Assign
|
// Assign
|
||||||
var bytes = new byte[0];
|
var bytes = EmptyArray<byte>.Value;
|
||||||
var matcher = new JsonPartialMatcher("");
|
var matcher = new JsonPartialMatcher("");
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ public class JsonPartialWildcardMatcherTests
|
|||||||
public void JsonPartialWildcardMatcher_IsMatch_ByteArray()
|
public void JsonPartialWildcardMatcher_IsMatch_ByteArray()
|
||||||
{
|
{
|
||||||
// Assign
|
// Assign
|
||||||
var bytes = new byte[0];
|
var bytes = EmptyArray<byte>.Value;
|
||||||
var matcher = new JsonPartialWildcardMatcher("");
|
var matcher = new JsonPartialWildcardMatcher("");
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using System;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using NFluent;
|
using NFluent;
|
||||||
using WireMock.Matchers;
|
using WireMock.Matchers;
|
||||||
@@ -37,7 +38,7 @@ public class JsonPathMatcherTests
|
|||||||
public void JsonPathMatcher_IsMatch_ByteArray()
|
public void JsonPathMatcher_IsMatch_ByteArray()
|
||||||
{
|
{
|
||||||
// Assign
|
// Assign
|
||||||
var bytes = new byte[0];
|
var bytes = EmptyArray<byte>.Value;
|
||||||
var matcher = new JsonPathMatcher("");
|
var matcher = new JsonPathMatcher("");
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|||||||
Reference in New Issue
Block a user