using System; using System.Collections.Generic; using System.Linq; using JetBrains.Annotations; using WireMock.Validation; namespace WireMock.Matchers.Request { /// /// The request cookie matcher. /// public class RequestMessageCookieMatcher : IRequestMatcher { private readonly MatchBehaviour _matchBehaviour; private readonly bool _ignoreCase; /// /// The funcs. /// public Func, bool>[] Funcs { get; } /// /// The name /// public string Name { get; } /// /// The matchers. /// public IStringMatcher[] Matchers { get; } /// /// Initializes a new instance of the class. /// /// The match behaviour. /// The name. /// The pattern. /// The ignoreCase. public RequestMessageCookieMatcher(MatchBehaviour matchBehaviour, [NotNull] string name, [NotNull] string pattern, bool ignoreCase = true) { Check.NotNull(name, nameof(name)); Check.NotNull(pattern, nameof(pattern)); _matchBehaviour = matchBehaviour; _ignoreCase = ignoreCase; Name = name; Matchers = new IStringMatcher[] { new WildcardMatcher(matchBehaviour, pattern, ignoreCase) }; } /// /// Initializes a new instance of the class. /// /// The name. /// The matchers. public RequestMessageCookieMatcher([NotNull] string name, [NotNull] params IStringMatcher[] matchers) { Check.NotNull(name, nameof(name)); Check.NotNull(matchers, nameof(matchers)); Name = name; Matchers = matchers; } /// /// Initializes a new instance of the class. /// /// The funcs. public RequestMessageCookieMatcher([NotNull] params Func, bool>[] funcs) { Check.NotNull(funcs, nameof(funcs)); Funcs = funcs; } /// public double GetMatchingScore(RequestMessage requestMessage, RequestMatchResult requestMatchResult) { double score = IsMatch(requestMessage); return requestMatchResult.AddScore(GetType(), score); } private double IsMatch(RequestMessage requestMessage) { if (requestMessage.Cookies == null) { 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(cookies))); } if (Matchers == null) { return MatchScores.Mismatch; } if (!cookies.ContainsKey(Name)) { return MatchBehaviourHelper.Convert(_matchBehaviour, MatchScores.Mismatch); } string value = cookies[Name]; return Matchers.Max(m => m.IsMatch(value)); } } }