private static bool TryMatchContainsOrNotContains(HeaderMatcher matcher, StringValues requestHeaderValues) { Debug.Assert(matcher.Mode is HeaderMatchMode.Contains or HeaderMatchMode.NotContains, $"{matcher.Mode}"); var requestHeaderCount = requestHeaderValues.Count; for (var i = 0; i < requestHeaderCount; i++) { var requestValue = requestHeaderValues[i]; if (requestValue is null) { continue; } foreach (var expectedValue in matcher.Values) { if (requestValue.Contains(expectedValue, matcher.Comparison)) { return(matcher.Mode != HeaderMatchMode.NotContains); } } } return(matcher.Mode == HeaderMatchMode.NotContains); }
public nock MatchHeaders(Func <NameValueCollection, bool> requestHeadersMatcher) { if (requestHeadersMatcher == null) { throw new ArgumentException("Request headers matcher function must be defined"); } IsCorrectlyReferencedFunction(requestHeadersMatcher); _headerMatcher = HeaderMatcher.Match; _requestHeadersMatcher = requestHeadersMatcher; return(this); }
private void ExpectSaslAuthentication(Symbol mechanism, Action <byte[]> initialResponseMatcher) { var headerMatcher = new HeaderMatcher(AmqpHeader.SASL_HEADER, AmqpHeader.SASL_HEADER) .WithOnComplete(context => context.SendCommand(new SaslMechanisms { SaslServerMechanisms = new[] { mechanism } })); AddMatcher(headerMatcher); var saslInitMatcher = new FrameMatcher <SaslInit>() .WithAssertion(saslInit => Assert.AreEqual(mechanism, saslInit.Mechanism)) .WithAssertion(saslInit => initialResponseMatcher(saslInit.InitialResponse)) .WithOnComplete(context => { context.SendCommand(new SaslOutcome { Code = SaslCode.Ok }, FrameType.Sasl); }) .WithShouldContinue(false); AddMatcher(saslInitMatcher); }
public nock MatchHeaders(NameValueCollection headers, bool exact = false) { if (headers == null) { throw new ArgumentException("Request headers must be defined"); } if (exact) { _headerMatcher = HeaderMatcher.ExactMatch; } else { _headerMatcher = HeaderMatcher.Match; } _requestHeaders = headers; return(this); }
public nock MatchHeader(string headerName, string headerValue) { if (string.IsNullOrEmpty(headerName)) { throw new ArgumentException("Header name must be defined"); } if (headerValue == null) { throw new ArgumentException("Header value must be defined"); } if (_headerMatcher == HeaderMatcher.None) { _headerMatcher = HeaderMatcher.Match; } _requestHeaders.Add(headerName, headerValue); return(this); }
private static bool TryMatchExactOrPrefix(HeaderMatcher matcher, StringValues requestHeaderValues) { var requestHeaderCount = requestHeaderValues.Count; for (var i = 0; i < requestHeaderCount; i++) { var requestValue = requestHeaderValues[i].AsSpan(); while (!requestValue.IsEmpty) { requestValue = requestValue.TrimStart(' '); // Find the end of the next value. // Separators inside a quote pair must be ignored as they are a part of the value. var separatorOrQuoteIndex = requestValue.IndexOfAny('"', matcher.Separator); while (separatorOrQuoteIndex != -1 && requestValue[separatorOrQuoteIndex] == '"') { var closingQuoteIndex = requestValue.Slice(separatorOrQuoteIndex + 1).IndexOf('"'); if (closingQuoteIndex == -1) { separatorOrQuoteIndex = -1; } else { var offset = separatorOrQuoteIndex + closingQuoteIndex + 2; separatorOrQuoteIndex = requestValue.Slice(offset).IndexOfAny('"', matcher.Separator); if (separatorOrQuoteIndex != -1) { separatorOrQuoteIndex += offset; } } } ReadOnlySpan <char> value; if (separatorOrQuoteIndex == -1) { value = requestValue; requestValue = default; } else { value = requestValue.Slice(0, separatorOrQuoteIndex); requestValue = requestValue.Slice(separatorOrQuoteIndex + 1); } if (value.Length > 1 && value[0] == '"' && value[^ 1] == '"') { value = value.Slice(1, value.Length - 2); } foreach (var expectedValue in matcher.Values) { if (matcher.Mode == HeaderMatchMode.ExactHeader ? value.Equals(expectedValue, matcher.Comparison) : value.StartsWith(expectedValue, matcher.Comparison)) { return(true); } } } } return(false); }