Parsers are now non-static (when appropriate)
This commit is contained in:
parent
7a56073835
commit
d1ab35db87
|
|
@ -44,7 +44,7 @@ namespace Microsoft.AspNetCore.Rewrite
|
|||
public static RewriteOptions RewriteRule(this RewriteOptions options, string regex, string onMatch, bool stopProcessing)
|
||||
{
|
||||
var builder = new UrlRewriteRuleBuilder();
|
||||
var pattern = InputParser.ParseInputString(onMatch);
|
||||
var pattern = new InputParser().ParseInputString(onMatch);
|
||||
|
||||
builder.AddUrlMatch(regex);
|
||||
builder.AddUrlAction(pattern, actionType: ActionType.Rewrite, stopProcessing: stopProcessing);
|
||||
|
|
@ -60,7 +60,7 @@ namespace Microsoft.AspNetCore.Rewrite
|
|||
public static RewriteOptions RedirectRule(this RewriteOptions options, string regex, string onMatch, int statusCode, bool stopProcessing)
|
||||
{
|
||||
var builder = new UrlRewriteRuleBuilder();
|
||||
var pattern = InputParser.ParseInputString(onMatch);
|
||||
var pattern = new InputParser().ParseInputString(onMatch);
|
||||
|
||||
builder.AddUrlMatch(regex);
|
||||
builder.AddUrlAction(pattern, actionType: ActionType.Redirect, stopProcessing: stopProcessing);
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.CodeRules
|
|||
{
|
||||
public int? SSLPort { get; set; }
|
||||
public int StatusCode { get; set; }
|
||||
|
||||
public override RuleResult ApplyRule(RewriteContext context)
|
||||
{
|
||||
if (!context.HttpContext.Request.IsHttps)
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.CodeRules
|
|||
|
||||
public bool stopProcessing { get; set; }
|
||||
public int? SSLPort { get; set; }
|
||||
|
||||
public override RuleResult ApplyRule(RewriteContext context)
|
||||
{
|
||||
if (!context.HttpContext.Request.IsHttps)
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using System;
|
||||
using Microsoft.AspNetCore.Rewrite.Internal;
|
||||
|
||||
namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
||||
{
|
||||
|
|
@ -10,7 +9,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
|||
/// Parses the "CondPattern" portion of the RewriteCond.
|
||||
/// RewriteCond TestString CondPattern
|
||||
/// </summary>
|
||||
public static class ConditionPatternParser
|
||||
public class ConditionPatternParser
|
||||
{
|
||||
private const char Not = '!';
|
||||
private const char Dash = '-';
|
||||
|
|
@ -26,7 +25,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
|||
/// </summary>
|
||||
/// <param name="condition">The CondPattern portion of a mod_rewrite RewriteCond.</param>
|
||||
/// <returns>A new parsed condition.</returns>
|
||||
public static ParsedModRewriteInput ParseActionCondition(string condition)
|
||||
public ParsedModRewriteInput ParseActionCondition(string condition)
|
||||
{
|
||||
if (condition == null)
|
||||
{
|
||||
|
|
@ -39,7 +38,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
|||
throw new FormatException(Resources.FormatError_InputParserUnrecognizedParameter(condition, context.Index));
|
||||
}
|
||||
|
||||
// If we hit a !, make sure the condition is inverted when resolving the string
|
||||
// If we hit a !, invert the condition
|
||||
if (context.Current == Not)
|
||||
{
|
||||
results.Invert = true;
|
||||
|
|
@ -139,7 +138,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
|||
/// <param name="context"></param>
|
||||
/// <param name="invert"></param>
|
||||
/// <returns></returns>
|
||||
public static ParsedModRewriteInput ParseProperty(ParserContext context, bool invert)
|
||||
private static ParsedModRewriteInput ParseProperty(ParserContext context, bool invert)
|
||||
{
|
||||
if (!context.Next())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -15,6 +15,14 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
|||
var rules = new List<Rule>();
|
||||
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++;
|
||||
|
|
@ -26,7 +34,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
|||
{
|
||||
continue;
|
||||
}
|
||||
var tokens = Tokenizer.Tokenize(line);
|
||||
var tokens = tokenizer.Tokenize(line);
|
||||
if (tokens.Count > 4)
|
||||
{
|
||||
// This means the line didn't have an appropriate format, throw format exception
|
||||
|
|
@ -40,13 +48,13 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
|||
case "RewriteCond":
|
||||
try
|
||||
{
|
||||
var pattern = TestStringParser.Parse(tokens[1]);
|
||||
var condActionParsed = ConditionPatternParser.ParseActionCondition(tokens[2]);
|
||||
var pattern = testStringParser.Parse(tokens[1]);
|
||||
var condActionParsed = conditionParser.ParseActionCondition(tokens[2]);
|
||||
|
||||
var flags = new Flags();
|
||||
if (tokens.Count == 4)
|
||||
{
|
||||
flags = FlagParser.Parse(tokens[3]);
|
||||
flags = flagsParser.Parse(tokens[3]);
|
||||
}
|
||||
|
||||
builder.AddConditionFromParts(pattern, condActionParsed, flags);
|
||||
|
|
@ -59,14 +67,17 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
|||
case "RewriteRule":
|
||||
try
|
||||
{
|
||||
var regex = RuleRegexParser.ParseRuleRegex(tokens[1]);
|
||||
var pattern = TestStringParser.Parse(tokens[2]);
|
||||
var regex = regexParser.ParseRuleRegex(tokens[1]);
|
||||
var pattern = testStringParser.Parse(tokens[2]);
|
||||
|
||||
// TODO see if we can have flags be null.
|
||||
var flags = new Flags();
|
||||
Flags flags;
|
||||
if (tokens.Count == 4)
|
||||
{
|
||||
flags = FlagParser.Parse(tokens[3]);
|
||||
flags = flagsParser.Parse(tokens[3]);
|
||||
}
|
||||
else
|
||||
{
|
||||
flags = new Flags();
|
||||
}
|
||||
|
||||
builder.AddMatch(regex, flags);
|
||||
|
|
|
|||
|
|
@ -2,22 +2,68 @@
|
|||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
||||
{
|
||||
public class FlagParser
|
||||
{
|
||||
public static Flags Parse(string flagString)
|
||||
{
|
||||
private readonly IDictionary<string, FlagType> _ruleFlagLookup = new Dictionary<string, FlagType>(StringComparer.OrdinalIgnoreCase) {
|
||||
{ "b", FlagType.EscapeBackreference},
|
||||
{ "c", FlagType.Chain },
|
||||
{ "chain", FlagType.Chain},
|
||||
{ "co", FlagType.Cookie },
|
||||
{ "cookie", FlagType.Cookie },
|
||||
{ "dpi", FlagType.DiscardPath },
|
||||
{ "discardpath", FlagType.DiscardPath },
|
||||
{ "e", FlagType.Env},
|
||||
{ "env", FlagType.Env},
|
||||
{ "end", FlagType.End },
|
||||
{ "f", FlagType.Forbidden },
|
||||
{ "forbidden", FlagType.Forbidden },
|
||||
{ "g", FlagType.Gone },
|
||||
{ "gone", FlagType.Gone },
|
||||
{ "h", FlagType.Handler },
|
||||
{ "handler", FlagType.Handler },
|
||||
{ "l", FlagType.Last },
|
||||
{ "last", FlagType.Last },
|
||||
{ "n", FlagType.Next },
|
||||
{ "next", FlagType.Next },
|
||||
{ "nc", FlagType.NoCase },
|
||||
{ "nocase", FlagType.NoCase },
|
||||
{ "ne", FlagType.NoEscape },
|
||||
{ "noescape", FlagType.NoEscape },
|
||||
{ "ns", FlagType.NoSubReq },
|
||||
{ "nosubreq", FlagType.NoSubReq },
|
||||
{ "p", FlagType.Proxy },
|
||||
{ "proxy", FlagType.Proxy },
|
||||
{ "pt", FlagType.PassThrough },
|
||||
{ "passthrough", FlagType.PassThrough },
|
||||
{ "qsa", FlagType.QSAppend },
|
||||
{ "qsappend", FlagType.QSAppend },
|
||||
{ "qsd", FlagType.QSDiscard },
|
||||
{ "qsdiscard", FlagType.QSDiscard },
|
||||
{ "qsl", FlagType.QSLast },
|
||||
{ "qslast", FlagType.QSLast },
|
||||
{ "r", FlagType.Redirect },
|
||||
{ "redirect", FlagType.Redirect },
|
||||
{ "s", FlagType.Skip },
|
||||
{ "skip", FlagType.Skip },
|
||||
{ "t", FlagType.Type },
|
||||
{ "type", FlagType.Type },
|
||||
};
|
||||
|
||||
public Flags Parse(string flagString)
|
||||
{
|
||||
if (string.IsNullOrEmpty(flagString))
|
||||
{
|
||||
return null;
|
||||
throw new ArgumentNullException(nameof(flagString));
|
||||
}
|
||||
|
||||
// Check that flags are contained within []
|
||||
if (!flagString.StartsWith("[") || !flagString.EndsWith("]"))
|
||||
if (!(flagString.StartsWith("[") && flagString.EndsWith("]")))
|
||||
{
|
||||
throw new FormatException();
|
||||
throw new FormatException("Flags should start and end with square brackets: [flags]");
|
||||
}
|
||||
|
||||
// Lexing esque step to split all flags.
|
||||
|
|
@ -27,13 +73,20 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
|||
foreach (string token in tokens)
|
||||
{
|
||||
var hasPayload = token.Split('=');
|
||||
|
||||
FlagType flag;
|
||||
if (!_ruleFlagLookup.TryGetValue(hasPayload[0], out flag))
|
||||
{
|
||||
throw new FormatException($"Unrecognized flag: {hasPayload[0]}");
|
||||
}
|
||||
|
||||
if (hasPayload.Length == 2)
|
||||
{
|
||||
flags.SetFlag(hasPayload[0], hasPayload[1]);
|
||||
flags.SetFlag(flag, hasPayload[1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
flags.SetFlag(hasPayload[0], string.Empty);
|
||||
flags.SetFlag(flag, string.Empty);
|
||||
}
|
||||
}
|
||||
return flags;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
// Copyright (c) .NET Foundation. All rights reserved.
|
||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
||||
|
|
@ -11,51 +10,6 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
|||
// http://httpd.apache.org/docs/current/expr.html#vars
|
||||
public class Flags
|
||||
{
|
||||
private static IDictionary<string, FlagType> _ruleFlagLookup = new Dictionary<string, FlagType>(StringComparer.OrdinalIgnoreCase) {
|
||||
{ "b", FlagType.EscapeBackreference},
|
||||
{ "c", FlagType.Chain },
|
||||
{ "chain", FlagType.Chain},
|
||||
{ "co", FlagType.Cookie },
|
||||
{ "cookie", FlagType.Cookie },
|
||||
{ "dpi", FlagType.DiscardPath },
|
||||
{ "discardpath", FlagType.DiscardPath },
|
||||
{ "e", FlagType.Env},
|
||||
{ "env", FlagType.Env},
|
||||
{ "end", FlagType.End },
|
||||
{ "f", FlagType.Forbidden },
|
||||
{ "forbidden", FlagType.Forbidden },
|
||||
{ "g", FlagType.Gone },
|
||||
{ "gone", FlagType.Gone },
|
||||
{ "h", FlagType.Handler },
|
||||
{ "handler", FlagType.Handler },
|
||||
{ "l", FlagType.Last },
|
||||
{ "last", FlagType.Last },
|
||||
{ "n", FlagType.Next },
|
||||
{ "next", FlagType.Next },
|
||||
{ "nc", FlagType.NoCase },
|
||||
{ "nocase", FlagType.NoCase },
|
||||
{ "ne", FlagType.NoEscape },
|
||||
{ "noescape", FlagType.NoEscape },
|
||||
{ "ns", FlagType.NoSubReq },
|
||||
{ "nosubreq", FlagType.NoSubReq },
|
||||
{ "p", FlagType.Proxy },
|
||||
{ "proxy", FlagType.Proxy },
|
||||
{ "pt", FlagType.PassThrough },
|
||||
{ "passthrough", FlagType.PassThrough },
|
||||
{ "qsa", FlagType.QSAppend },
|
||||
{ "qsappend", FlagType.QSAppend },
|
||||
{ "qsd", FlagType.QSDiscard },
|
||||
{ "qsdiscard", FlagType.QSDiscard },
|
||||
{ "qsl", FlagType.QSLast },
|
||||
{ "qslast", FlagType.QSLast },
|
||||
{ "r", FlagType.Redirect },
|
||||
{ "redirect", FlagType.Redirect },
|
||||
{ "s", FlagType.Skip },
|
||||
{ "skip", FlagType.Skip },
|
||||
{ "t", FlagType.Type },
|
||||
{ "type", FlagType.Type },
|
||||
};
|
||||
|
||||
public IDictionary<FlagType, string> FlagDictionary { get; }
|
||||
|
||||
public Flags(IDictionary<FlagType, string> flags)
|
||||
|
|
@ -68,16 +22,6 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
|||
FlagDictionary = new Dictionary<FlagType, string>();
|
||||
}
|
||||
|
||||
public void SetFlag(string flag, string value)
|
||||
{
|
||||
FlagType res;
|
||||
if (!_ruleFlagLookup.TryGetValue(flag, out res))
|
||||
{
|
||||
throw new FormatException("Unrecognized flag");
|
||||
}
|
||||
SetFlag(res, value);
|
||||
}
|
||||
|
||||
public void SetFlag(FlagType flag, string value)
|
||||
{
|
||||
if (value == null)
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
|
||||
using System;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Rewrite.Internal;
|
||||
using Microsoft.Net.Http.Headers;
|
||||
|
||||
namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Http.Extensions;
|
||||
using Microsoft.AspNetCore.Rewrite.Internal;
|
||||
|
||||
namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
||||
{
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text.RegularExpressions;
|
||||
using Microsoft.AspNetCore.Rewrite.Internal;
|
||||
using Microsoft.AspNetCore.Rewrite.Internal.PreActions;
|
||||
using Microsoft.AspNetCore.Rewrite.Internal.UrlActions;
|
||||
using Microsoft.AspNetCore.Rewrite.Internal.UrlMatches;
|
||||
|
|
@ -32,13 +31,18 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
|||
public void AddRule(string rule)
|
||||
{
|
||||
// TODO
|
||||
var tokens = Tokenizer.Tokenize(rule);
|
||||
var regex = RuleRegexParser.ParseRuleRegex(tokens[1]);
|
||||
var pattern = TestStringParser.Parse(tokens[2]);
|
||||
var flags = new Flags();
|
||||
var tokens = new Tokenizer().Tokenize(rule);
|
||||
var regex = new RuleRegexParser().ParseRuleRegex(tokens[1]);
|
||||
var pattern = new TestStringParser().Parse(tokens[2]);
|
||||
|
||||
Flags flags;
|
||||
if (tokens.Count == 4)
|
||||
{
|
||||
flags = FlagParser.Parse(tokens[3]);
|
||||
flags = new FlagParser().Parse(tokens[3]);
|
||||
}
|
||||
else
|
||||
{
|
||||
flags = new Flags();
|
||||
}
|
||||
AddMatch(regex, flags);
|
||||
AddAction(pattern, flags);
|
||||
|
|
|
|||
|
|
@ -5,9 +5,9 @@ using System;
|
|||
|
||||
namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
||||
{
|
||||
public static class RuleRegexParser
|
||||
public class RuleRegexParser
|
||||
{
|
||||
public static ParsedModRewriteInput ParseRuleRegex(string regex)
|
||||
public ParsedModRewriteInput ParseRuleRegex(string regex)
|
||||
{
|
||||
if (regex == null || regex == string.Empty)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using System;
|
||||
using Microsoft.AspNetCore.Rewrite.Internal;
|
||||
using Microsoft.AspNetCore.Rewrite.Internal.PatternSegments;
|
||||
using Microsoft.Net.Http.Headers;
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Microsoft.AspNetCore.Rewrite.Internal;
|
||||
using Microsoft.AspNetCore.Rewrite.Internal.PatternSegments;
|
||||
|
||||
namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
||||
|
|
@ -32,7 +31,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
|||
/// $1</param>
|
||||
/// <returns>A new <see cref="Pattern"/>, containing a list of <see cref="PatternSegment"/></returns>
|
||||
/// http://httpd.apache.org/docs/current/mod/mod_rewrite.html
|
||||
public static Pattern Parse(string testString)
|
||||
public Pattern Parse(string testString)
|
||||
{
|
||||
if (testString == null)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
|||
/// <summary>
|
||||
/// Tokenizes a mod_rewrite rule, delimited by spaces.
|
||||
/// </summary>
|
||||
public static class Tokenizer
|
||||
public class Tokenizer
|
||||
{
|
||||
private const char Space = ' ';
|
||||
private const char Escape = '\\';
|
||||
|
|
@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
|||
/// </summary>
|
||||
/// <param name="rule">The rule to tokenize.</param>
|
||||
/// <returns>A list of tokens.</returns>
|
||||
public static List<string> Tokenize(string rule)
|
||||
public List<string> Tokenize(string rule)
|
||||
{
|
||||
// TODO make list of strings a reference to the original rule? (run into problems with escaped spaces).
|
||||
// TODO handle "s and probably replace \ character with no slash.
|
||||
|
|
|
|||
|
|
@ -15,7 +15,6 @@ namespace Microsoft.AspNetCore.Rewrite.Internal
|
|||
|
||||
public string Evaluate(RewriteContext context, MatchResults ruleMatch, MatchResults condMatch)
|
||||
{
|
||||
// TODO consider thread static for string builder - DAVID PERF
|
||||
foreach (var pattern in PatternSegments)
|
||||
{
|
||||
context.Builder.Append(pattern.Evaluate(context, ruleMatch, condMatch));
|
||||
|
|
|
|||
|
|
@ -7,15 +7,16 @@ using System.IO;
|
|||
using System.Linq;
|
||||
using System.Xml;
|
||||
using System.Xml.Linq;
|
||||
using Microsoft.AspNetCore.Rewrite.Internal;
|
||||
|
||||
namespace Microsoft.AspNetCore.Rewrite.Internal.UrlRewrite
|
||||
{
|
||||
public static class UrlRewriteFileParser
|
||||
public class FileParser
|
||||
{
|
||||
private static readonly TimeSpan RegexTimeout = TimeSpan.FromMilliseconds(1);
|
||||
|
||||
public static List<UrlRewriteRule> Parse(TextReader reader)
|
||||
private InputParser _inputParser = new InputParser();
|
||||
|
||||
public List<UrlRewriteRule> Parse(TextReader reader)
|
||||
{
|
||||
var xmlDoc = XDocument.Load(reader, LoadOptions.SetLineInfo);
|
||||
var xmlRoot = xmlDoc.Descendants(RewriteTags.Rewrite).FirstOrDefault();
|
||||
|
|
@ -32,7 +33,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlRewrite
|
|||
return null;
|
||||
}
|
||||
|
||||
private static void ParseRules(XElement rules, List<UrlRewriteRule> result)
|
||||
private void ParseRules(XElement rules, List<UrlRewriteRule> result)
|
||||
{
|
||||
if (rules == null)
|
||||
{
|
||||
|
|
@ -51,7 +52,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlRewrite
|
|||
}
|
||||
}
|
||||
|
||||
private static void ParseRuleAttributes(XElement rule, UrlRewriteRuleBuilder builder)
|
||||
private void ParseRuleAttributes(XElement rule, UrlRewriteRuleBuilder builder)
|
||||
{
|
||||
builder.Name = rule.Attribute(RewriteTags.Name)?.Value;
|
||||
|
||||
|
|
@ -90,7 +91,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlRewrite
|
|||
ParseUrlAction(action, builder, stopProcessing);
|
||||
}
|
||||
|
||||
private static void ParseMatch(XElement match, UrlRewriteRuleBuilder builder, PatternSyntax patternSyntax)
|
||||
private void ParseMatch(XElement match, UrlRewriteRuleBuilder builder, PatternSyntax patternSyntax)
|
||||
{
|
||||
var parsedInputString = match.Attribute(RewriteTags.Url)?.Value;
|
||||
if (parsedInputString == null)
|
||||
|
|
@ -112,7 +113,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlRewrite
|
|||
builder.AddUrlMatch(parsedInputString, ignoreCase, negate, patternSyntax);
|
||||
}
|
||||
|
||||
private static void ParseConditions(XElement conditions, UrlRewriteRuleBuilder builder, PatternSyntax patternSyntax)
|
||||
private void ParseConditions(XElement conditions, UrlRewriteRuleBuilder builder, PatternSyntax patternSyntax)
|
||||
{
|
||||
if (conditions == null)
|
||||
{
|
||||
|
|
@ -139,7 +140,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlRewrite
|
|||
}
|
||||
}
|
||||
|
||||
private static void ParseCondition(XElement condition, UrlRewriteRuleBuilder builder, PatternSyntax patternSyntax)
|
||||
private void ParseCondition(XElement condition, UrlRewriteRuleBuilder builder, PatternSyntax patternSyntax)
|
||||
{
|
||||
bool ignoreCase;
|
||||
if (!bool.TryParse(condition.Attribute(RewriteTags.IgnoreCase)?.Value, out ignoreCase))
|
||||
|
|
@ -170,7 +171,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlRewrite
|
|||
Pattern input = null;
|
||||
try
|
||||
{
|
||||
input = InputParser.ParseInputString(parsedInputString);
|
||||
input = _inputParser.ParseInputString(parsedInputString);
|
||||
builder.AddUrlCondition(input, parsedPatternString, patternSyntax, matchType, ignoreCase, negate);
|
||||
|
||||
}
|
||||
|
|
@ -180,7 +181,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlRewrite
|
|||
}
|
||||
}
|
||||
|
||||
private static void ParseUrlAction(XElement urlAction, UrlRewriteRuleBuilder builder, bool stopProcessing)
|
||||
private void ParseUrlAction(XElement urlAction, UrlRewriteRuleBuilder builder, bool stopProcessing)
|
||||
{
|
||||
ActionType actionType;
|
||||
if (!Enum.TryParse(urlAction.Attribute(RewriteTags.Type)?.Value, out actionType))
|
||||
|
|
@ -202,7 +203,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlRewrite
|
|||
|
||||
try
|
||||
{
|
||||
var input = InputParser.ParseInputString(urlAction.Attribute(RewriteTags.Url)?.Value);
|
||||
var input = _inputParser.ParseInputString(urlAction.Attribute(RewriteTags.Url)?.Value);
|
||||
builder.AddUrlAction(input, actionType, appendQuery, stopProcessing, (int)redirectType);
|
||||
}
|
||||
catch (FormatException formatException)
|
||||
|
|
@ -211,14 +212,14 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlRewrite
|
|||
}
|
||||
}
|
||||
|
||||
private static void ThrowUrlFormatException(XElement element, string message)
|
||||
private void ThrowUrlFormatException(XElement element, string message)
|
||||
{
|
||||
var line = ((IXmlLineInfo)element).LineNumber;
|
||||
var col = ((IXmlLineInfo)element).LinePosition;
|
||||
throw new FormatException(Resources.FormatError_UrlRewriteParseError(message, line, col));
|
||||
}
|
||||
|
||||
private static void ThrowUrlFormatException(XElement element, string message, Exception ex)
|
||||
private void ThrowUrlFormatException(XElement element, string message, Exception ex)
|
||||
{
|
||||
var line = ((IXmlLineInfo)element).LineNumber;
|
||||
var col = ((IXmlLineInfo)element).LinePosition;
|
||||
|
|
@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlRewrite
|
|||
/// </summary>
|
||||
/// <param name="testString"></param>
|
||||
/// <returns>A new <see cref="Pattern"/>, containing a list of <see cref="PatternSegment"/></returns>
|
||||
public static Pattern ParseInputString(string testString)
|
||||
public Pattern ParseInputString(string testString)
|
||||
{
|
||||
if (testString == null)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ using System;
|
|||
using System.Collections.Generic;
|
||||
using System.Text.RegularExpressions;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Rewrite.Internal;
|
||||
using Microsoft.AspNetCore.Rewrite.Internal.UrlActions;
|
||||
using Microsoft.AspNetCore.Rewrite.Internal.UrlMatches;
|
||||
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ namespace Microsoft.AspNetCore.Rewrite
|
|||
var path = Path.Combine(hostingEnv.ContentRootPath, filePath);
|
||||
using (var stream = File.OpenRead(path))
|
||||
{
|
||||
options.Rules.AddRange(UrlRewriteFileParser.Parse(new StreamReader(stream)));
|
||||
options.Rules.AddRange(new FileParser().Parse(new StreamReader(stream)));
|
||||
};
|
||||
return options;
|
||||
}
|
||||
|
|
@ -60,7 +60,7 @@ namespace Microsoft.AspNetCore.Rewrite
|
|||
|
||||
using (stream)
|
||||
{
|
||||
options.Rules.AddRange(UrlRewriteFileParser.Parse(stream));
|
||||
options.Rules.AddRange(new FileParser().Parse(stream));
|
||||
};
|
||||
return options;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.ModRewrite
|
|||
[InlineData("=hey", OperationType.Equal, "hey", ConditionType.StringComp)]
|
||||
public void ConditionParser_CheckStringComp(string condition, OperationType operation, string variable, ConditionType conditionType)
|
||||
{
|
||||
var results = ConditionPatternParser.ParseActionCondition(condition);
|
||||
var results = new ConditionPatternParser().ParseActionCondition(condition);
|
||||
|
||||
var expected = new ParsedModRewriteInput { OperationType = operation, ConditionType = conditionType, Operand = variable, Invert = false };
|
||||
Assert.True(CompareConditions(results, expected));
|
||||
|
|
@ -26,7 +26,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.ModRewrite
|
|||
public void ConditionParser_CheckRegexEqual()
|
||||
{
|
||||
var condition = @"(.*)";
|
||||
var results = ConditionPatternParser.ParseActionCondition(condition);
|
||||
var results = new ConditionPatternParser().ParseActionCondition(condition);
|
||||
|
||||
var expected = new ParsedModRewriteInput { ConditionType = ConditionType.Regex, Operand = "(.*)", Invert = false };
|
||||
Assert.True(CompareConditions(results, expected));
|
||||
|
|
@ -44,7 +44,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.ModRewrite
|
|||
[InlineData("-x", OperationType.Executable, ConditionType.PropertyTest)]
|
||||
public void ConditionParser_CheckFileOperations(string condition, OperationType operation, ConditionType cond)
|
||||
{
|
||||
var results = ConditionPatternParser.ParseActionCondition(condition);
|
||||
var results = new ConditionPatternParser().ParseActionCondition(condition);
|
||||
|
||||
var expected = new ParsedModRewriteInput { ConditionType = cond, OperationType = operation , Invert = false };
|
||||
Assert.True(CompareConditions(results, expected));
|
||||
|
|
@ -62,7 +62,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.ModRewrite
|
|||
[InlineData("!-x", OperationType.Executable, ConditionType.PropertyTest)]
|
||||
public void ConditionParser_CheckFileOperationsInverted(string condition, OperationType operation, ConditionType cond)
|
||||
{
|
||||
var results = ConditionPatternParser.ParseActionCondition(condition);
|
||||
var results = new ConditionPatternParser().ParseActionCondition(condition);
|
||||
|
||||
var expected = new ParsedModRewriteInput { ConditionType = cond, OperationType = operation, Invert = true };
|
||||
Assert.True(CompareConditions(results, expected));
|
||||
|
|
@ -77,7 +77,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.ModRewrite
|
|||
[InlineData("-ne1", OperationType.NotEqual, "1", ConditionType.IntComp)]
|
||||
public void ConditionParser_CheckIntComp(string condition, OperationType operation, string variable, ConditionType cond)
|
||||
{
|
||||
var results = ConditionPatternParser.ParseActionCondition(condition);
|
||||
var results = new ConditionPatternParser().ParseActionCondition(condition);
|
||||
|
||||
var expected = new ParsedModRewriteInput { ConditionType = cond, OperationType = operation, Invert = false, Operand = variable };
|
||||
Assert.True(CompareConditions(results, expected));
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.ModRewrite
|
|||
[Fact]
|
||||
public void FlagParser_CheckSingleTerm()
|
||||
{
|
||||
var results = FlagParser.Parse("[NC]");
|
||||
var results = new FlagParser().Parse("[NC]");
|
||||
var dict = new Dictionary<FlagType, string>();
|
||||
dict.Add(FlagType.NoCase, string.Empty);
|
||||
var expected = new Flags(dict);
|
||||
|
|
@ -24,7 +24,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.ModRewrite
|
|||
[Fact]
|
||||
public void FlagParser_CheckManyTerms()
|
||||
{
|
||||
var results = FlagParser.Parse("[NC,F,L]");
|
||||
var results = new FlagParser().Parse("[NC,F,L]");
|
||||
var dict = new Dictionary<FlagType, string>();
|
||||
dict.Add(FlagType.NoCase, string.Empty);
|
||||
dict.Add(FlagType.Forbidden, string.Empty);
|
||||
|
|
@ -37,7 +37,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.ModRewrite
|
|||
[Fact]
|
||||
public void FlagParser_CheckManyTermsWithEquals()
|
||||
{
|
||||
var results = FlagParser.Parse("[NC,F,R=301]");
|
||||
var results = new FlagParser().Parse("[NC,F,R=301]");
|
||||
var dict = new Dictionary<FlagType, string>();
|
||||
dict.Add(FlagType.NoCase, string.Empty);
|
||||
dict.Add(FlagType.Forbidden, string.Empty);
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.ModRewrite
|
|||
public void Tokenize_RewriteCondtion()
|
||||
{
|
||||
var testString = "RewriteCond %{HTTPS} !-f";
|
||||
var tokens = Tokenizer.Tokenize(testString);
|
||||
var tokens = new Tokenizer().Tokenize(testString);
|
||||
|
||||
var expected = new List<string>();
|
||||
expected.Add("RewriteCond");
|
||||
|
|
@ -27,7 +27,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.ModRewrite
|
|||
{
|
||||
// TODO need consultation on escape characters.
|
||||
var testString = @"RewriteCond %{HTTPS}\ what !-f";
|
||||
var tokens = Tokenizer.Tokenize(testString);
|
||||
var tokens = new Tokenizer().Tokenize(testString);
|
||||
|
||||
var expected = new List<string>();
|
||||
expected.Add("RewriteCond");
|
||||
|
|
|
|||
|
|
@ -12,19 +12,19 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.ModRewrite
|
|||
[Fact]
|
||||
public void RuleRegexParser_ShouldThrowOnNull()
|
||||
{
|
||||
Assert.Throws<FormatException>(() => RuleRegexParser.ParseRuleRegex(null));
|
||||
Assert.Throws<FormatException>(() => new RuleRegexParser().ParseRuleRegex(null));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RuleRegexParser_ShouldThrowOnEmpty()
|
||||
{
|
||||
Assert.Throws<FormatException>(() => RuleRegexParser.ParseRuleRegex(string.Empty));
|
||||
Assert.Throws<FormatException>(() => new RuleRegexParser().ParseRuleRegex(string.Empty));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RuleRegexParser_RegularRegexExpression()
|
||||
{
|
||||
var results = RuleRegexParser.ParseRuleRegex("(.*)");
|
||||
var results = new RuleRegexParser().ParseRuleRegex("(.*)");
|
||||
Assert.False(results.Invert);
|
||||
Assert.Equal(results.Operand, "(.*)");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
|
|||
pattern: "article.aspx?id={R:1}&title={R:2}"));
|
||||
|
||||
// act
|
||||
var res = UrlRewriteFileParser.Parse(new StringReader(xml));
|
||||
var res = new FileParser().Parse(new StringReader(xml));
|
||||
|
||||
// assert
|
||||
AssertUrlRewriteRuleEquality(res, expected);
|
||||
|
|
@ -60,7 +60,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
|
|||
var condList = new List<Condition>();
|
||||
condList.Add(new Condition
|
||||
{
|
||||
Input = InputParser.ParseInputString("{HTTPS}"),
|
||||
Input = new InputParser().ParseInputString("{HTTPS}"),
|
||||
Match = new RegexMatch(new Regex("^OFF$"), false)
|
||||
});
|
||||
|
||||
|
|
@ -72,7 +72,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
|
|||
pattern: "article.aspx?id={R:1}&title={R:2}"));
|
||||
|
||||
// act
|
||||
var res = UrlRewriteFileParser.Parse(new StringReader(xml));
|
||||
var res = new FileParser().Parse(new StringReader(xml));
|
||||
|
||||
// assert
|
||||
AssertUrlRewriteRuleEquality(res, expected);
|
||||
|
|
@ -104,7 +104,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
|
|||
var condList = new List<Condition>();
|
||||
condList.Add(new Condition
|
||||
{
|
||||
Input = InputParser.ParseInputString("{HTTPS}"),
|
||||
Input = new InputParser().ParseInputString("{HTTPS}"),
|
||||
Match = new RegexMatch(new Regex("^OFF$"), false)
|
||||
});
|
||||
|
||||
|
|
@ -121,7 +121,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
|
|||
pattern: "article.aspx?id={R:1}&title={R:2}"));
|
||||
|
||||
// act
|
||||
var res = UrlRewriteFileParser.Parse(new StringReader(xml));
|
||||
var res = new FileParser().Parse(new StringReader(xml));
|
||||
|
||||
// assert
|
||||
AssertUrlRewriteRuleEquality(res, expected);
|
||||
|
|
@ -147,7 +147,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
|
|||
{
|
||||
return new UrlRewriteRule
|
||||
{
|
||||
Action = new RewriteAction(RuleTerminiation.Continue, InputParser.ParseInputString(Url), clearQuery: false),
|
||||
Action = new RewriteAction(RuleTerminiation.Continue, new InputParser().ParseInputString(Url), clearQuery: false),
|
||||
Name = name,
|
||||
Enabled = enabled,
|
||||
InitialMatch = new RegexMatch(new Regex("^OFF$"), false)
|
||||
|
|
@ -190,6 +190,9 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
|
|||
Assert.Equal(c1.Input.PatternSegments.Count, c2.Input.PatternSegments.Count);
|
||||
}
|
||||
}
|
||||
|
||||
Assert.Equal(r1.Action.GetType(), r2.Action.GetType());
|
||||
Assert.Equal(r1.InitialMatch.GetType(), r2.InitialMatch.GetType());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -114,7 +114,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
|
|||
public void ThrowFormatExceptionWithCorrectMessage(string input, string expected)
|
||||
{
|
||||
// Arrange, Act, Assert
|
||||
var ex = Assert.Throws<FormatException>(() => UrlRewriteFileParser.Parse(new StringReader(input)));
|
||||
var ex = Assert.Throws<FormatException>(() => new FileParser().Parse(new StringReader(input)));
|
||||
Assert.Equal(ex.Message, expected);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
|
|||
public void InputParser_ParseLiteralString()
|
||||
{
|
||||
var testString = "hello/hey/what";
|
||||
var result = InputParser.ParseInputString(testString);
|
||||
var result = new InputParser().ParseInputString(testString);
|
||||
Assert.Equal(result.PatternSegments.Count, 1);
|
||||
}
|
||||
|
||||
|
|
@ -29,7 +29,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
|
|||
[InlineData("foo/", 1)]
|
||||
public void InputParser_ParseStringWithBackReference(string testString, int expected)
|
||||
{
|
||||
var result = InputParser.ParseInputString(testString);
|
||||
var result = new InputParser().ParseInputString(testString);
|
||||
Assert.Equal(result.PatternSegments.Count, expected);
|
||||
}
|
||||
|
||||
|
|
@ -45,7 +45,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
|
|||
[InlineData("hey/{R:1}/{C:1}", "hey/foo/foo")]
|
||||
public void EvaluateBackReferenceRule(string testString, string expected)
|
||||
{
|
||||
var middle = InputParser.ParseInputString(testString);
|
||||
var middle = new InputParser().ParseInputString(testString);
|
||||
var result = middle.Evaluate(CreateTestRewriteContext(), CreateTestRuleMatch(), CreateTestCondMatch());
|
||||
Assert.Equal(result, expected);
|
||||
}
|
||||
|
|
@ -58,7 +58,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
|
|||
[InlineData("hey/ToLower:/what", "hey/ToLower:/what")]
|
||||
public void EvaluatToLowerRule(string testString, string expected)
|
||||
{
|
||||
var middle = InputParser.ParseInputString(testString);
|
||||
var middle = new InputParser().ParseInputString(testString);
|
||||
var result = middle.Evaluate(CreateTestRewriteContext(), CreateTestRuleMatch(), CreateTestCondMatch());
|
||||
Assert.Equal(result, expected);
|
||||
}
|
||||
|
|
@ -67,7 +67,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
|
|||
[InlineData("hey/{UrlEncode:<hey>}", "hey/%3Chey%3E")]
|
||||
public void EvaluatUriEncodeRule(string testString, string expected)
|
||||
{
|
||||
var middle = InputParser.ParseInputString(testString);
|
||||
var middle = new InputParser().ParseInputString(testString);
|
||||
var result = middle.Evaluate(CreateTestRewriteContext(), CreateTestRuleMatch(), CreateTestCondMatch());
|
||||
Assert.Equal(result, expected);
|
||||
}
|
||||
|
|
@ -86,7 +86,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
|
|||
[InlineData("{HTTPS")]
|
||||
public void FormatExceptionsOnBadSyntax(string testString)
|
||||
{
|
||||
Assert.Throws<FormatException>(() => InputParser.ParseInputString(testString));
|
||||
Assert.Throws<FormatException>(() => new InputParser().ParseInputString(testString));
|
||||
}
|
||||
|
||||
private RewriteContext CreateTestRewriteContext()
|
||||
|
|
|
|||
Loading…
Reference in New Issue