public void RuleParse_ParseTypicalRule() { // arrange var xml = @"<rewrite> <rules> <rule name=""Rewrite to article.aspx""> <match url = ""^article/([0-9]+)/([_0-9a-z-]+)"" /> <action type=""Rewrite"" url =""article.aspx?id={R:1}&title={R:2}"" /> </rule> </rules> </rewrite>"; var expected = new List <IISUrlRewriteRule>(); expected.Add(CreateTestRule(new ConditionCollection(), url: "^article/([0-9]+)/([_0-9a-z-]+)", name: "Rewrite to article.aspx", actionType: ActionType.Rewrite, pattern: "article.aspx?id={R:1}&title={R:2}")); // act var res = new UrlRewriteFileParser().Parse(new StringReader(xml), false); // assert AssertUrlRewriteRuleEquality(expected, res); }
public void Should_parse_global_rules() { // arrange var xml = @"<rewrite> <globalRules> <rule name=""httpsOnly"" patternSyntax=""ECMAScript"" stopProcessing=""true""> <match url="".*"" /> <conditions logicalGrouping=""MatchAll"" trackAllCaptures=""false""> <add input=""{HTTPS}"" pattern=""off"" /> </conditions> <action type=""Redirect"" url=""https://{HTTP_HOST}{REQUEST_URI}"" /> </rule> </globalRules> <rules> <rule name=""Rewrite to article.aspx""> <match url = ""^article/([0-9]+)/([_0-9a-z-]+)"" /> <action type=""Rewrite"" url =""article.aspx?id={R:1}&title={R:2}"" /> </rule> </rules> </rewrite>"; // act var rules = new UrlRewriteFileParser().Parse(new StringReader(xml), false); // assert Assert.Equal(2, rules.Count); Assert.True(rules[0].Global); Assert.False(rules[1].Global); }
public void RuleParse_ParseSingleRuleWithSingleCondition() { // arrange var xml = @"<rewrite> <rules> <rule name=""Rewrite to article.aspx""> <match url = ""^article/([0-9]+)/([_0-9a-z-]+)"" /> <conditions> <add input=""{HTTPS}"" pattern=""^OFF$"" /> </conditions> <action type=""Rewrite"" url =""article.aspx?id={R:1}&title={R:2}"" /> </rule> </rules> </rewrite>"; var condList = new ConditionCollection(); condList.Add(new Condition(new InputParser().ParseInputString("{HTTPS}"), new RegexMatch(new Regex("^OFF$"), false))); var expected = new List <IISUrlRewriteRule>(); expected.Add(CreateTestRule(condList, url: "^article/([0-9]+)/([_0-9a-z-]+)", name: "Rewrite to article.aspx", actionType: ActionType.Rewrite, pattern: "article.aspx?id={R:1}&title={R:2}")); // act var res = new UrlRewriteFileParser().Parse(new StringReader(xml), false); // assert AssertUrlRewriteRuleEquality(expected, res); }
public void Should_skip_empty_conditions() { // arrange var xml = @"<rewrite> <rules> <rule name=""redirect-aspnet-mvc"" enabled=""true"" stopProcessing=""true""> <match url=""^aspnet/Mvc"" /> <conditions logicalGrouping=""MatchAll"" trackAllCaptures=""false"" /> <action type=""Redirect"" url=""https://github.com/aspnet/AspNetCore"" /> </rule> </rules> </rewrite>"; // act var rules = new UrlRewriteFileParser().Parse(new StringReader(xml), false); // assert Assert.Null(rules[0].Conditions); }
public void ApplyRule_AssertNoTerminateFlagWillNotTerminateOnNoAction() { var xml = new StringReader(@"<rewrite> <rules> <rule name=""Test""> <match url = ""(.*)"" ignoreCase=""false"" /> <action type = ""None""/> </rule> </rules> </rewrite>"); var rules = new UrlRewriteFileParser().Parse(xml, false); Assert.Equal(1, rules.Count); var context = new RewriteContext { HttpContext = new DefaultHttpContext() }; rules.FirstOrDefault().ApplyRule(context); Assert.Equal(RuleResult.ContinueRules, context.Result); }
public void ApplyRule_AssertStopProcessingFlagWillTerminateOnNoAction() { var xml = new StringReader(@"<rewrite> <rules> <rule name=""Test"" stopProcessing=""true""> <match url = ""(.*)""/> <action type = ""None""/> </rule> </rules> </rewrite>"); var rules = new UrlRewriteFileParser().Parse(xml, false); Assert.Equal(1, rules.Count); var context = new RewriteContext { HttpContext = new DefaultHttpContext() }; rules.FirstOrDefault().ApplyRule(context); Assert.Equal(RuleResult.SkipRemainingRules, context.Result); }
public static RewriteOptions AddIISUrlRewrite(this RewriteOptions options, TextReader reader, bool alwaysUseManagedServerVariables = false) { if (options == null) { throw new ArgumentNullException(nameof(options)); } if (reader == null) { throw new ArgumentNullException(nameof(reader)); } var rules = new UrlRewriteFileParser().Parse(reader, alwaysUseManagedServerVariables); foreach (var rule in rules) { options.Rules.Add(rule); } return(options); }
/// <summary> /// Add rules from a IIS config file containing Url Rewrite rules /// </summary> /// <param name="options">The <see cref="RewriteOptions"/></param> /// <param name="reader">The text reader stream.</param> public static RewriteOptions AddIISUrlRewrite(this RewriteOptions options, TextReader reader) { if (options == null) { throw new ArgumentNullException(nameof(options)); } if (reader == null) { throw new ArgumentException(nameof(reader)); } var rules = new UrlRewriteFileParser().Parse(reader); foreach (var rule in rules) { options.Rules.Add(rule); } return(options); }
public void ApplyRule_TrackAllCaptures() { var xml = new StringReader(@"<rewrite> <rules> <rule name=""Test""> <match url = ""(.*)"" ignoreCase=""false"" /> <conditions trackAllCaptures = ""true"" > <add input = ""{REQUEST_URI}"" pattern = ""^/([a-zA-Z]+)/([0-9]+)/$"" /> </conditions > <action type = ""None""/> </rule> </rules> </rewrite>"); var rules = new UrlRewriteFileParser().Parse(xml, false); Assert.Equal(1, rules.Count); Assert.True(rules[0].Conditions.TrackAllCaptures); var context = new RewriteContext { HttpContext = new DefaultHttpContext() }; rules.FirstOrDefault().ApplyRule(context); Assert.Equal(RuleResult.ContinueRules, context.Result); }