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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
[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); }