Skip to content

Commit

Permalink
When posting new mapping, use DateParseHandling.None (#348)
Browse files Browse the repository at this point in the history
* .

* OfType + test

* remove line
  • Loading branch information
StefH authored Sep 20, 2019
1 parent 9cd16f7 commit 666992e
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 22 deletions.
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
</PropertyGroup>

<PropertyGroup>
<VersionPrefix>1.0.31</VersionPrefix>
<VersionPrefix>1.0.32</VersionPrefix>
</PropertyGroup>

<Choose>
Expand Down
4 changes: 2 additions & 2 deletions src/WireMock.Net/RequestBuilders/Request.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ private Request(IList<IRequestMatcher> requestMatchers) : base(requestMatchers)
/// <returns>A List{T}</returns>
public IList<T> GetRequestMessageMatchers<T>() where T : IRequestMatcher
{
return new ReadOnlyCollection<T>(_requestMatchers.Where(rm => rm is T).Cast<T>().ToList());
return new ReadOnlyCollection<T>(_requestMatchers.OfType<T>().ToList());
}

/// <summary>
Expand All @@ -50,7 +50,7 @@ public IList<T> GetRequestMessageMatchers<T>() where T : IRequestMatcher
/// <returns>A RequestMatcher</returns>
public T GetRequestMessageMatcher<T>() where T : IRequestMatcher
{
return _requestMatchers.Where(rm => rm is T).Cast<T>().FirstOrDefault();
return _requestMatchers.OfType<T>().FirstOrDefault();
}

/// <inheritdoc cref="IClientIPRequestBuilder.WithClientIP(IStringMatcher[])"/>
Expand Down
30 changes: 22 additions & 8 deletions src/WireMock.Net/Serialization/MatcherMapper.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
using JetBrains.Annotations;
using SimMetrics.Net;
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using JetBrains.Annotations;
using SimMetrics.Net;
using WireMock.Admin.Mappings;
using WireMock.Matchers;
using WireMock.Settings;
Expand Down Expand Up @@ -36,7 +36,7 @@ public IMatcher Map([CanBeNull] MatcherModel matcher)
string matcherName = parts[0];
string matcherType = parts.Length > 1 ? parts[1] : null;

string[] stringPatterns = matcher.Patterns != null ? matcher.Patterns.Cast<string>().ToArray() : new[] { matcher.Pattern as string };
string[] stringPatterns = matcher.Patterns != null ? matcher.Patterns.OfType<string>().ToArray() : new[] { matcher.Pattern as string };
MatchBehaviour matchBehaviour = matcher.RejectOnMatch == true ? MatchBehaviour.RejectOnMatch : MatchBehaviour.AcceptOnMatch;

switch (matcherName)
Expand All @@ -48,8 +48,7 @@ public IMatcher Map([CanBeNull] MatcherModel matcher)
return new ExactMatcher(matchBehaviour, stringPatterns);

case "ExactObjectMatcher":
var bytePattern = Convert.FromBase64String(stringPatterns[0]);
return new ExactObjectMatcher(matchBehaviour, bytePattern);
return CreateExactObjectMatcher(matchBehaviour, stringPatterns[0]);

case "RegexMatcher":
return new RegexMatcher(matchBehaviour, stringPatterns, matcher.IgnoreCase == true);
Expand All @@ -64,7 +63,7 @@ public IMatcher Map([CanBeNull] MatcherModel matcher)
return new JmesPathMatcher(matchBehaviour, stringPatterns);

case "XPathMatcher":
return new XPathMatcher(matchBehaviour, (string)matcher.Pattern);
return new XPathMatcher(matchBehaviour, stringPatterns);

case "WildcardMatcher":
return new WildcardMatcher(matchBehaviour, stringPatterns, matcher.IgnoreCase == true);
Expand All @@ -76,13 +75,28 @@ public IMatcher Map([CanBeNull] MatcherModel matcher)
throw new NotSupportedException($"Matcher '{matcherName}' with Type '{matcherType}' is not supported.");
}

return new SimMetricsMatcher(matchBehaviour, (string)matcher.Pattern, type);
return new SimMetricsMatcher(matchBehaviour, stringPatterns, type);

default:
throw new NotSupportedException($"Matcher '{matcherName}' is not supported.");
}
}

private ExactObjectMatcher CreateExactObjectMatcher(MatchBehaviour matchBehaviour, string stringPattern)
{
byte[] bytePattern;
try
{
bytePattern = Convert.FromBase64String(stringPattern);
}
catch
{
throw new ArgumentException($"Matcher 'ExactObjectMatcher' has invalid pattern. The pattern value '{stringPattern}' is not a Base64String.", nameof(stringPattern));
}

return new ExactObjectMatcher(matchBehaviour, bytePattern);
}

public MatcherModel[] Map([CanBeNull] IEnumerable<IMatcher> matchers)
{
return matchers?.Select(Map).Where(m => m != null).ToArray();
Expand Down
12 changes: 6 additions & 6 deletions src/WireMock.Net/Server/FluentMockServer.Admin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -653,7 +653,7 @@ private IRequestBuilder InitRequestBuilder(RequestModel requestModel, bool pathO
var clientIPModel = JsonUtils.ParseJTokenToObject<ClientIPModel>(requestModel.ClientIP);
if (clientIPModel?.Matchers != null)
{
requestBuilder = requestBuilder.WithPath(clientIPModel.Matchers.Select(_matcherMapper.Map).Cast<IStringMatcher>().ToArray());
requestBuilder = requestBuilder.WithPath(clientIPModel.Matchers.Select(_matcherMapper.Map).OfType<IStringMatcher>().ToArray());
}
}
}
Expand All @@ -671,7 +671,7 @@ private IRequestBuilder InitRequestBuilder(RequestModel requestModel, bool pathO
var pathModel = JsonUtils.ParseJTokenToObject<PathModel>(requestModel.Path);
if (pathModel?.Matchers != null)
{
requestBuilder = requestBuilder.WithPath(pathModel.Matchers.Select(_matcherMapper.Map).Cast<IStringMatcher>().ToArray());
requestBuilder = requestBuilder.WithPath(pathModel.Matchers.Select(_matcherMapper.Map).OfType<IStringMatcher>().ToArray());
pathOrUrlmatchersValid = true;
}
}
Expand All @@ -688,7 +688,7 @@ private IRequestBuilder InitRequestBuilder(RequestModel requestModel, bool pathO
var urlModel = JsonUtils.ParseJTokenToObject<UrlModel>(requestModel.Url);
if (urlModel?.Matchers != null)
{
requestBuilder = requestBuilder.WithUrl(urlModel.Matchers.Select(_matcherMapper.Map).Cast<IStringMatcher>().ToArray());
requestBuilder = requestBuilder.WithUrl(urlModel.Matchers.Select(_matcherMapper.Map).OfType<IStringMatcher>().ToArray());
pathOrUrlmatchersValid = true;
}
}
Expand All @@ -709,15 +709,15 @@ private IRequestBuilder InitRequestBuilder(RequestModel requestModel, bool pathO
{
foreach (var headerModel in requestModel.Headers.Where(h => h.Matchers != null))
{
requestBuilder = requestBuilder.WithHeader(headerModel.Name, headerModel.Matchers.Select(_matcherMapper.Map).Cast<IStringMatcher>().ToArray());
requestBuilder = requestBuilder.WithHeader(headerModel.Name, headerModel.Matchers.Select(_matcherMapper.Map).OfType<IStringMatcher>().ToArray());
}
}

if (requestModel.Cookies != null)
{
foreach (var cookieModel in requestModel.Cookies.Where(c => c.Matchers != null))
{
requestBuilder = requestBuilder.WithCookie(cookieModel.Name, cookieModel.Matchers.Select(_matcherMapper.Map).Cast<IStringMatcher>().ToArray());
requestBuilder = requestBuilder.WithCookie(cookieModel.Name, cookieModel.Matchers.Select(_matcherMapper.Map).OfType<IStringMatcher>().ToArray());
}
}

Expand All @@ -726,7 +726,7 @@ private IRequestBuilder InitRequestBuilder(RequestModel requestModel, bool pathO
foreach (var paramModel in requestModel.Params.Where(c => c.Matchers != null))
{
bool ignoreCase = paramModel?.IgnoreCase ?? false;
requestBuilder = requestBuilder.WithParam(paramModel.Name, ignoreCase, paramModel.Matchers.Select(_matcherMapper.Map).Cast<IStringMatcher>().ToArray());
requestBuilder = requestBuilder.WithParam(paramModel.Name, ignoreCase, paramModel.Matchers.Select(_matcherMapper.Map).OfType<IStringMatcher>().ToArray());
}
}

Expand Down
6 changes: 4 additions & 2 deletions src/WireMock.Net/Util/BodyParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ internal static class BodyParser
new WildcardMatcher("application/x-www-form-urlencoded", true)
};

private static readonly JsonSerializerSettings JsonSerializerSettings = new JsonSerializerSettings { DateParseHandling = DateParseHandling.None };

public static bool ShouldParseBody([CanBeNull] string method)
{
if (string.IsNullOrEmpty(method))
Expand Down Expand Up @@ -135,12 +137,12 @@ public static async Task<BodyData> Parse([NotNull] Stream stream, [CanBeNull] st
data.Encoding = DefaultEncoding;
data.DetectedBodyType = BodyType.String;

// If string is not null or empty, try to get as Json
// If string is not null or empty, try to deserialize the string to a JObject
if (!string.IsNullOrEmpty(data.BodyAsString))
{
try
{
data.BodyAsJson = JsonConvert.DeserializeObject(data.BodyAsString, new JsonSerializerSettings { Formatting = Formatting.Indented });
data.BodyAsJson = JsonConvert.DeserializeObject(data.BodyAsString, JsonSerializerSettings);
data.DetectedBodyType = BodyType.Json;
}
catch
Expand Down
20 changes: 17 additions & 3 deletions test/WireMock.Net.Tests/Serialization/MatcherModelMapperTests.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using NFluent;
using System;
using System;
using Moq;
using NFluent;
using WireMock.Admin.Mappings;
using WireMock.Matchers;
using WireMock.Serialization;
Expand Down Expand Up @@ -68,7 +68,7 @@ public void MatcherModelMapper_Map_ExactMatcher_Patterns()
}

[Fact]
public void MatcherModelMapper_Map_ExactObjectMatcher_Pattern()
public void MatcherModelMapper_Map_ExactObjectMatcher_ValidBase64StringPattern()
{
// Assign
var model = new MatcherModel
Expand All @@ -84,6 +84,20 @@ public void MatcherModelMapper_Map_ExactObjectMatcher_Pattern()
Check.That(matcher.ValueAsBytes).ContainsExactly(new byte[] { 115, 116, 101, 102 });
}

[Fact]
public void MatcherModelMapper_Map_ExactObjectMatcher_InvalidBase64StringPattern()
{
// Assign
var model = new MatcherModel
{
Name = "ExactObjectMatcher",
Patterns = new object[] { "_" }
};

// Act & Assert
Check.ThatCode(() => _sut.Map(model)).Throws<ArgumentException>();
}

[Fact]
public void MatcherModelMapper_Map_RegexMatcher()
{
Expand Down

0 comments on commit 666992e

Please sign in to comment.