using JetBrains.Annotations; using System; using System.Collections.Generic; using System.Linq; using WireMock.Types; using WireMock.Validation; namespace WireMock.Matchers.Request { /// /// The request header matcher. /// /// public class RequestMessageHeaderMatcher : IRequestMatcher { private readonly MatchBehaviour _matchBehaviour; private readonly bool _ignoreCase; /// /// The functions /// 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 name. /// The pattern. /// Ignore the case from the pattern. /// The match behaviour. public RequestMessageHeaderMatcher(MatchBehaviour matchBehaviour, [NotNull] string name, [NotNull] string pattern, bool ignoreCase) { 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 match behaviour. /// The name. /// The patterns. /// Ignore the case from the pattern. public RequestMessageHeaderMatcher(MatchBehaviour matchBehaviour, [NotNull] string name, bool ignoreCase, [NotNull] params string[] patterns) : this(matchBehaviour, name, ignoreCase, patterns.Select(pattern => new WildcardMatcher(matchBehaviour, pattern, ignoreCase)).Cast().ToArray()) { Check.NotNull(patterns, nameof(patterns)); } /// /// Initializes a new instance of the class. /// /// The match behaviour. /// The name. /// The matchers. /// Ignore the case from the pattern. public RequestMessageHeaderMatcher(MatchBehaviour matchBehaviour, [NotNull] string name, bool ignoreCase, [NotNull] params IStringMatcher[] matchers) { Check.NotNull(name, nameof(name)); Check.NotNull(matchers, nameof(matchers)); _matchBehaviour = matchBehaviour; Name = name; Matchers = matchers; _ignoreCase = ignoreCase; } /// /// Initializes a new instance of the class. /// /// The funcs. public RequestMessageHeaderMatcher([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.Headers == null) { 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(headers.ToDictionary(entry => entry.Key, entry => entry.Value.ToArray())))); } if (Matchers == null) { return MatchScores.Mismatch; } if (!headers.ContainsKey(Name)) { return MatchBehaviourHelper.Convert(_matchBehaviour, MatchScores.Mismatch); } WireMockList list = headers[Name]; return Matchers.Max(m => list.Max(m.IsMatch)); // TODO : is this correct ? } } }