Ejemplo n.º 1
0
        public void ConditionParser_ParseLiteral()
        {
            var serverVar = "Hello!";
            var result    = new TestStringParser().Parse(serverVar);

            var list = new List <PatternSegment>();

            list.Add(new LiteralSegment(serverVar));
            var expected = new Pattern(list);

            AssertPatternsEqual(expected, result);
        }
Ejemplo n.º 2
0
        public void ConditionParser_ParseRuleVariable()
        {
            var serverVar = "$1";
            var result    = new TestStringParser().Parse(serverVar);

            var list = new List <PatternSegment>();

            list.Add(new RuleMatchSegment(1));
            var expected = new Pattern(list);

            AssertPatternsEqual(expected, result);
        }
Ejemplo n.º 3
0
    public void ConditionParser_ParseConditionParameters()
    {
        var serverVar = "%1";
        var result    = TestStringParser.Parse(serverVar);

        var list = new List <PatternSegment>();

        list.Add(new ConditionMatchSegment(1));
        var expected = new Pattern(list);

        AssertPatternsEqual(expected, result);
    }
Ejemplo n.º 4
0
        public void ConditionParser_MultipleServerVariables()
        {
            var serverVar = "%{HTTPS}%{REQUEST_URI}";
            var result    = new TestStringParser().Parse(serverVar);

            var list = new List <PatternSegment>();

            list.Add(new IsHttpsModSegment());
            list.Add(new UrlSegment());
            var expected = new Pattern(list);

            AssertPatternsEqual(expected, result);
        }
Ejemplo n.º 5
0
    public void ConditionParser_SingleServerVariable()
    {
        var serverVar = "%{HTTPS}";

        var result = TestStringParser.Parse(serverVar);

        var list = new List <PatternSegment>();

        list.Add(new IsHttpsModSegment());
        var expected = new Pattern(list);

        AssertPatternsEqual(expected, result);
    }
Ejemplo n.º 6
0
        public void ConditionParser_ParserComplexRequest()
        {
            var serverVar = "%{HTTPS}/$1";
            var result    = new TestStringParser().Parse(serverVar);

            var list = new List <PatternSegment>();

            list.Add(new IsHttpsModSegment());
            list.Add(new LiteralSegment("/"));
            list.Add(new RuleMatchSegment(1));
            var expected = new Pattern(list);

            AssertPatternsEqual(expected, result);
        }
Ejemplo n.º 7
0
    public void AddRule(string rule)
    {
        var tokens  = Tokenizer.Tokenize(rule) !;
        var regex   = RuleRegexParser.ParseRuleRegex(tokens[1]);
        var pattern = TestStringParser.Parse(tokens[2]);

        Flags flags;

        if (tokens.Count == 4)
        {
            flags = new FlagParser().Parse(tokens[3]);
        }
        else
        {
            flags = new Flags();
        }
        AddMatch(regex, flags);
        AddAction(pattern, flags);
    }
Ejemplo n.º 8
0
    public IList <IRule> Parse(TextReader input)
    {
        string?line;
        var    rules   = new List <IRule>();
        var    builder = new RuleBuilder();
        var    lineNum = 0;

        // parsers
        var testStringParser = new TestStringParser();
        var conditionParser  = new ConditionPatternParser();
        var regexParser      = new RuleRegexParser();
        var flagsParser      = new FlagParser();
        var tokenizer        = new Tokenizer();

        while ((line = input.ReadLine()) != null)
        {
            lineNum++;
            if (string.IsNullOrEmpty(line))
            {
                continue;
            }
            if (line.StartsWith('#'))
            {
                continue;
            }
            var tokens = tokenizer.Tokenize(line) !;
            if (tokens.Count > 4)
            {
                // This means the line didn't have an appropriate format, throw format exception
                throw new FormatException(Resources.FormatError_ModRewriteParseError("Too many tokens on line", lineNum));
            }

            switch (tokens[0])
            {
            case "RewriteBase":
                // the notion of the path base spans across all rules, not just mod_rewrite
                // So not implemented for now
                throw new NotImplementedException("RewriteBase is not implemented");

            case "RewriteCond":
                try
                {
                    var pattern          = testStringParser.Parse(tokens[1]);
                    var condActionParsed = conditionParser.ParseActionCondition(tokens[2]);

                    var flags = new Flags();
                    if (tokens.Count == 4)
                    {
                        flags = flagsParser.Parse(tokens[3]);
                    }

                    builder.AddConditionFromParts(pattern, condActionParsed, flags);
                }
                catch (FormatException formatException)
                {
                    throw new FormatException(Resources.FormatError_ModRewriteGeneralParseError(lineNum), formatException);
                }
                break;

            case "RewriteRule":
                try
                {
                    var regex   = regexParser.ParseRuleRegex(tokens[1]);
                    var pattern = testStringParser.Parse(tokens[2]);

                    Flags flags;
                    if (tokens.Count == 4)
                    {
                        flags = flagsParser.Parse(tokens[3]);
                    }
                    else
                    {
                        flags = new Flags();
                    }

                    builder.AddMatch(regex, flags);
                    builder.AddAction(pattern, flags);
                    rules.Add(builder.Build());
                    builder = new RuleBuilder();
                }
                catch (FormatException formatException)
                {
                    throw new FormatException(Resources.FormatError_ModRewriteGeneralParseError(lineNum), formatException);
                }
                break;

            case "RewriteMap":
                // Lack of use
                throw new NotImplementedException("RewriteMap are not implemented");

            case "RewriteEngine":
                // Explicitly do nothing here, no notion of turning on regex engine.
                break;

            default:
                throw new FormatException(Resources.FormatError_ModRewriteParseError("Unrecognized keyword: " + tokens[0], lineNum));
            }
        }
        return(rules);
    }
Ejemplo n.º 9
0
    [InlineData(@"%{asdf", "Missing close brace for parameter at string index: '6'")] // no closing } with characters
    public void ConditionParser_InvalidInput(string testString, string expected)
    {
        var ex = Assert.Throws <FormatException>(() => TestStringParser.Parse(testString));

        Assert.Equal(expected, ex.Message);
    }