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);
    }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
    }