diff --git a/src/WireMock.Net/Matchers/Request/RequestMessageCookieMatcher.cs b/src/WireMock.Net/Matchers/Request/RequestMessageCookieMatcher.cs index 8e5d9b4a0..1ae4ff6cb 100644 --- a/src/WireMock.Net/Matchers/Request/RequestMessageCookieMatcher.cs +++ b/src/WireMock.Net/Matchers/Request/RequestMessageCookieMatcher.cs @@ -12,6 +12,7 @@ namespace WireMock.Matchers.Request public class RequestMessageCookieMatcher : IRequestMatcher { private readonly MatchBehaviour _matchBehaviour; + private readonly bool _ignoreCase; /// /// The funcs. @@ -41,6 +42,7 @@ public RequestMessageCookieMatcher(MatchBehaviour matchBehaviour, [NotNull] stri Check.NotNull(pattern, nameof(pattern)); _matchBehaviour = matchBehaviour; + _ignoreCase = ignoreCase; Name = name; Matchers = new IStringMatcher[] { new WildcardMatcher(matchBehaviour, pattern, ignoreCase) }; } @@ -84,9 +86,12 @@ private double IsMatch(RequestMessage requestMessage) return MatchBehaviourHelper.Convert(_matchBehaviour, MatchScores.Mismatch); } + // Check if we want to use IgnoreCase to compare the Cookie-Name and Cookie-Value + var cookies = !_ignoreCase ? requestMessage.Cookies : new Dictionary(requestMessage.Cookies, StringComparer.OrdinalIgnoreCase); + if (Funcs != null) { - return MatchScores.ToScore(Funcs.Any(f => f(requestMessage.Cookies))); + return MatchScores.ToScore(Funcs.Any(f => f(cookies))); } if (Matchers == null) @@ -94,12 +99,12 @@ private double IsMatch(RequestMessage requestMessage) return MatchScores.Mismatch; } - if (!requestMessage.Cookies.ContainsKey(Name)) + if (!cookies.ContainsKey(Name)) { return MatchBehaviourHelper.Convert(_matchBehaviour, MatchScores.Mismatch); } - string value = requestMessage.Cookies[Name]; + string value = cookies[Name]; return Matchers.Max(m => m.IsMatch(value)); } } diff --git a/src/WireMock.Net/Matchers/Request/RequestMessageHeaderMatcher.cs b/src/WireMock.Net/Matchers/Request/RequestMessageHeaderMatcher.cs index f8e16d5cc..d60c30fd7 100644 --- a/src/WireMock.Net/Matchers/Request/RequestMessageHeaderMatcher.cs +++ b/src/WireMock.Net/Matchers/Request/RequestMessageHeaderMatcher.cs @@ -14,6 +14,7 @@ namespace WireMock.Matchers.Request public class RequestMessageHeaderMatcher : IRequestMatcher { private readonly MatchBehaviour _matchBehaviour; + private readonly bool _ignoreCase; /// /// The functions @@ -43,6 +44,7 @@ public RequestMessageHeaderMatcher(MatchBehaviour matchBehaviour, [NotNull] stri Check.NotNull(pattern, nameof(pattern)); _matchBehaviour = matchBehaviour; + _ignoreCase = ignoreCase; Name = name; Matchers = new IStringMatcher[] { new WildcardMatcher(matchBehaviour, pattern, ignoreCase) }; } @@ -60,6 +62,7 @@ public RequestMessageHeaderMatcher(MatchBehaviour matchBehaviour, [NotNull] stri Check.NotNull(patterns, nameof(patterns)); _matchBehaviour = matchBehaviour; + _ignoreCase = ignoreCase; Name = name; Matchers = patterns.Select(pattern => new WildcardMatcher(matchBehaviour, pattern, ignoreCase)).Cast().ToArray(); } @@ -103,9 +106,12 @@ private double IsMatch(RequestMessage requestMessage) return MatchBehaviourHelper.Convert(_matchBehaviour, MatchScores.Mismatch); } + // Check if we want to use IgnoreCase to compare the Header-Name and Header-Value(s) + var headers = !_ignoreCase ? requestMessage.Headers : new Dictionary>(requestMessage.Headers, StringComparer.OrdinalIgnoreCase); + if (Funcs != null) { - return MatchScores.ToScore(Funcs.Any(f => f(requestMessage.Headers.ToDictionary(entry => entry.Key, entry => entry.Value.ToArray())))); + return MatchScores.ToScore(Funcs.Any(f => f(headers.ToDictionary(entry => entry.Key, entry => entry.Value.ToArray())))); } if (Matchers == null) @@ -113,12 +119,12 @@ private double IsMatch(RequestMessage requestMessage) return MatchScores.Mismatch; } - if (!requestMessage.Headers.ContainsKey(Name)) + if (!headers.ContainsKey(Name)) { return MatchBehaviourHelper.Convert(_matchBehaviour, MatchScores.Mismatch); } - WireMockList list = requestMessage.Headers[Name]; + WireMockList list = headers[Name]; return Matchers.Max(m => list.Max(value => m.IsMatch(value))); // TODO : is this correct ? } } diff --git a/test/WireMock.Net.Tests/RequestMatchers/RequestMessageCookieMatcherTests.cs b/test/WireMock.Net.Tests/RequestMatchers/RequestMessageCookieMatcherTests.cs index b70914d90..64a4029cb 100644 --- a/test/WireMock.Net.Tests/RequestMatchers/RequestMessageCookieMatcherTests.cs +++ b/test/WireMock.Net.Tests/RequestMatchers/RequestMessageCookieMatcherTests.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using NFluent; using WireMock.Matchers; using WireMock.Matchers.Request; @@ -134,5 +133,37 @@ public void RequestMessageCookieMatcher_GetMatchingScore_Func_Match() // Assert Check.That(score).IsEqualTo(1.0d); } + + [Fact] + public void RequestMessageCookieMatcher_GetMatchingScore_CaseIgnoreForCookieValue() + { + // Assign + var cookies = new Dictionary { { "cook", "teST" } }; + var requestMessage = new RequestMessage(new UrlDetails("http://localhost"), "GET", "127.0.0.1", null, null, cookies); + var matcher = new RequestMessageCookieMatcher(MatchBehaviour.AcceptOnMatch, "cook", "test", true); + + // Act + var result = new RequestMatchResult(); + double score = matcher.GetMatchingScore(requestMessage, result); + + // Assert + Check.That(score).IsEqualTo(1.0d); + } + + [Fact] + public void RequestMessageCookieMatcher_GetMatchingScore_CaseIgnoreForCookieName() + { + // Assign + var cookies = new Dictionary { { "cook", "teST" } }; + var requestMessage = new RequestMessage(new UrlDetails("http://localhost"), "GET", "127.0.0.1", null, null, cookies); + var matcher = new RequestMessageCookieMatcher(MatchBehaviour.AcceptOnMatch, "CooK", "test", true); + + // Act + var result = new RequestMatchResult(); + double score = matcher.GetMatchingScore(requestMessage, result); + + // Assert + Check.That(score).IsEqualTo(1.0d); + } } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/RequestMatchers/RequestMessageHeaderMatcherTests.cs b/test/WireMock.Net.Tests/RequestMatchers/RequestMessageHeaderMatcherTests.cs index 902167beb..51ee09fad 100644 --- a/test/WireMock.Net.Tests/RequestMatchers/RequestMessageHeaderMatcherTests.cs +++ b/test/WireMock.Net.Tests/RequestMatchers/RequestMessageHeaderMatcherTests.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using NFluent; using WireMock.Matchers; using WireMock.Matchers.Request; @@ -134,5 +133,37 @@ public void RequestMessageHeaderMatcher_GetMatchingScore_Func_Match() // Assert Check.That(score).IsEqualTo(1.0d); } + + [Fact] + public void RequestMessageHeaderMatcher_GetMatchingScore_CaseIgnoreForHeaderValue() + { + // Assign + var headers = new Dictionary { { "h", new[] { "teST" } } }; + var requestMessage = new RequestMessage(new UrlDetails("http://localhost"), "GET", "127.0.0.1", null, headers); + var matcher = new RequestMessageHeaderMatcher(MatchBehaviour.AcceptOnMatch, "h", "test", true); + + // Act + var result = new RequestMatchResult(); + double score = matcher.GetMatchingScore(requestMessage, result); + + // Assert + Check.That(score).IsEqualTo(1.0d); + } + + [Fact] + public void RequestMessageHeaderMatcher_GetMatchingScore_CaseIgnoreForHeaderName() + { + // Assign + var headers = new Dictionary { { "teST", new[] { "x" } } }; + var requestMessage = new RequestMessage(new UrlDetails("http://localhost"), "GET", "127.0.0.1", null, headers); + var matcher = new RequestMessageHeaderMatcher(MatchBehaviour.AcceptOnMatch, "TEST", "x", true); + + // Act + var result = new RequestMatchResult(); + double score = matcher.GetMatchingScore(requestMessage, result); + + // Assert + Check.That(score).IsEqualTo(1.0d); + } } } \ No newline at end of file