Changed the abstract class Rule to an interface IRule. Renamed the RuleTermination enum to RuleResult and renamed the values
This commit is contained in:
parent
d2fb2cd776
commit
ead052324c
|
|
@ -4,17 +4,17 @@
|
||||||
namespace Microsoft.AspNetCore.Rewrite
|
namespace Microsoft.AspNetCore.Rewrite
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents an abstract rule.
|
/// Represents a rule.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public abstract class Rule
|
public interface IRule
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Applies the rule.
|
/// Applies the rule.
|
||||||
/// Implementations of ApplyRule should set the value for <see cref="RewriteContext.Result"/>
|
/// Implementations of ApplyRule should set the value for <see cref="RewriteContext.Result"/>
|
||||||
/// (defaults to <see cref="RuleTermination.Continue"/> )
|
/// (defaults to RuleResult.ContinueRules)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context"></param>
|
/// <param name="context"></param>
|
||||||
public abstract void ApplyRule(RewriteContext context);
|
void ApplyRule(RewriteContext context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Rewrite.Logging;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Rewrite.Internal.ApacheModRewrite
|
namespace Microsoft.AspNetCore.Rewrite.Internal.ApacheModRewrite
|
||||||
{
|
{
|
||||||
public class ApacheModRewriteRule : Rule
|
public class ApacheModRewriteRule : IRule
|
||||||
{
|
{
|
||||||
public UrlMatch InitialMatch { get; }
|
public UrlMatch InitialMatch { get; }
|
||||||
public IList<Condition> Conditions { get; }
|
public IList<Condition> Conditions { get; }
|
||||||
|
|
@ -19,7 +19,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ApacheModRewrite
|
||||||
Actions = urlActions;
|
Actions = urlActions;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void ApplyRule(RewriteContext context)
|
public virtual void ApplyRule(RewriteContext context)
|
||||||
{
|
{
|
||||||
// 1. Figure out which section of the string to match for the initial rule.
|
// 1. Figure out which section of the string to match for the initial rule.
|
||||||
var initMatchRes = InitialMatch.Evaluate(context.HttpContext.Request.Path, context);
|
var initMatchRes = InitialMatch.Evaluate(context.HttpContext.Request.Path, context);
|
||||||
|
|
|
||||||
|
|
@ -9,10 +9,10 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ApacheModRewrite
|
||||||
{
|
{
|
||||||
public class FileParser
|
public class FileParser
|
||||||
{
|
{
|
||||||
public IList<Rule> Parse(TextReader input)
|
public IList<IRule> Parse(TextReader input)
|
||||||
{
|
{
|
||||||
string line;
|
string line;
|
||||||
var rules = new List<Rule>();
|
var rules = new List<IRule>();
|
||||||
var builder = new RuleBuilder();
|
var builder = new RuleBuilder();
|
||||||
var lineNum = 0;
|
var lineNum = 0;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -210,7 +210,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ApacheModRewrite
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var last = flags.HasFlag(FlagType.End) || flags.HasFlag(FlagType.Last);
|
var last = flags.HasFlag(FlagType.End) || flags.HasFlag(FlagType.Last);
|
||||||
var termination = last ? RuleTermination.StopRules : RuleTermination.Continue;
|
var termination = last ? RuleResult.SkipRemainingRules : RuleResult.ContinueRules;
|
||||||
_actions.Add(new RewriteAction(termination, pattern, queryStringAppend, queryStringDelete, escapeBackReference));
|
_actions.Add(new RewriteAction(termination, pattern, queryStringAppend, queryStringDelete, escapeBackReference));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ using System;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Rewrite.Internal
|
namespace Microsoft.AspNetCore.Rewrite.Internal
|
||||||
{
|
{
|
||||||
public class DelegateRule : Rule
|
public class DelegateRule : IRule
|
||||||
{
|
{
|
||||||
private readonly Action<RewriteContext> _onApplyRule;
|
private readonly Action<RewriteContext> _onApplyRule;
|
||||||
|
|
||||||
|
|
@ -13,6 +13,6 @@ namespace Microsoft.AspNetCore.Rewrite.Internal
|
||||||
{
|
{
|
||||||
_onApplyRule = onApplyRule;
|
_onApplyRule = onApplyRule;
|
||||||
}
|
}
|
||||||
public override void ApplyRule(RewriteContext context) => _onApplyRule(context);
|
public void ApplyRule(RewriteContext context) => _onApplyRule(context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Rewrite.Logging;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Rewrite.Internal.IISUrlRewrite
|
namespace Microsoft.AspNetCore.Rewrite.Internal.IISUrlRewrite
|
||||||
{
|
{
|
||||||
public class IISUrlRewriteRule : Rule
|
public class IISUrlRewriteRule : IRule
|
||||||
{
|
{
|
||||||
public string Name { get; }
|
public string Name { get; }
|
||||||
public UrlMatch InitialMatch { get; }
|
public UrlMatch InitialMatch { get; }
|
||||||
|
|
@ -25,7 +25,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.IISUrlRewrite
|
||||||
Action = action;
|
Action = action;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void ApplyRule(RewriteContext context)
|
public virtual void ApplyRule(RewriteContext context)
|
||||||
{
|
{
|
||||||
// Due to the path string always having a leading slash,
|
// Due to the path string always having a leading slash,
|
||||||
// remove it from the path before regex comparison
|
// remove it from the path before regex comparison
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.IISUrlRewrite
|
||||||
private const char CloseBrace = '}';
|
private const char CloseBrace = '}';
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a pattern, which is a template to create a new test string to
|
/// Creates a pattern, which is a template to create a new test string to
|
||||||
/// compare to the condition. Can contain server variables, back references, etc.
|
/// compare to the condition. Can contain server variables, back references, etc.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="testString"></param>
|
/// <param name="testString"></param>
|
||||||
|
|
@ -64,7 +64,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.IISUrlRewrite
|
||||||
context.Mark();
|
context.Mark();
|
||||||
// Four main cases:
|
// Four main cases:
|
||||||
// 1. {NAME} - Server Variable, create lambda to get the part of the context
|
// 1. {NAME} - Server Variable, create lambda to get the part of the context
|
||||||
// 2. {R:1} - Rule parameter
|
// 2. {R:1} - IRule parameter
|
||||||
// 3. {C:1} - Condition Parameter
|
// 3. {C:1} - Condition Parameter
|
||||||
// 4. {function:xxx} - String function
|
// 4. {function:xxx} - String function
|
||||||
// (unless we support Reload)
|
// (unless we support Reload)
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.IISUrlRewrite
|
||||||
if (xmlRoot != null)
|
if (xmlRoot != null)
|
||||||
{
|
{
|
||||||
var result = new List<IISUrlRewriteRule>();
|
var result = new List<IISUrlRewriteRule>();
|
||||||
// TODO Global rules are currently not treated differently than normal rules, fix.
|
// TODO Global rules are currently not treated differently than normal rules, fix.
|
||||||
// See: https://github.com/aspnet/BasicMiddleware/issues/59
|
// See: https://github.com/aspnet/BasicMiddleware/issues/59
|
||||||
ParseRules(xmlRoot.Descendants(RewriteTags.GlobalRules).FirstOrDefault(), result);
|
ParseRules(xmlRoot.Descendants(RewriteTags.GlobalRules).FirstOrDefault(), result);
|
||||||
ParseRules(xmlRoot.Descendants(RewriteTags.Rules).FirstOrDefault(), result);
|
ParseRules(xmlRoot.Descendants(RewriteTags.Rules).FirstOrDefault(), result);
|
||||||
|
|
|
||||||
|
|
@ -42,10 +42,10 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.IISUrlRewrite
|
||||||
switch (actionType)
|
switch (actionType)
|
||||||
{
|
{
|
||||||
case ActionType.None:
|
case ActionType.None:
|
||||||
_action = new VoidAction(stopProcessing ? RuleTermination.StopRules : RuleTermination.Continue);
|
_action = new VoidAction(stopProcessing ? RuleResult.SkipRemainingRules : RuleResult.ContinueRules);
|
||||||
break;
|
break;
|
||||||
case ActionType.Rewrite:
|
case ActionType.Rewrite:
|
||||||
_action = new RewriteAction(stopProcessing ? RuleTermination.StopRules : RuleTermination.Continue,
|
_action = new RewriteAction(stopProcessing ? RuleResult.SkipRemainingRules : RuleResult.ContinueRules,
|
||||||
url, appendQueryString);
|
url, appendQueryString);
|
||||||
break;
|
break;
|
||||||
case ActionType.Redirect:
|
case ActionType.Redirect:
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ using Microsoft.Net.Http.Headers;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Rewrite.Internal
|
namespace Microsoft.AspNetCore.Rewrite.Internal
|
||||||
{
|
{
|
||||||
public class RedirectRule : Rule
|
public class RedirectRule : IRule
|
||||||
{
|
{
|
||||||
private readonly TimeSpan _regexTimeout = TimeSpan.FromSeconds(1);
|
private readonly TimeSpan _regexTimeout = TimeSpan.FromSeconds(1);
|
||||||
public Regex InitialMatch { get; }
|
public Regex InitialMatch { get; }
|
||||||
|
|
@ -31,7 +31,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal
|
||||||
StatusCode = statusCode;
|
StatusCode = statusCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void ApplyRule(RewriteContext context)
|
public virtual void ApplyRule(RewriteContext context)
|
||||||
{
|
{
|
||||||
var path = context.HttpContext.Request.Path;
|
var path = context.HttpContext.Request.Path;
|
||||||
var pathBase = context.HttpContext.Request.PathBase;
|
var pathBase = context.HttpContext.Request.PathBase;
|
||||||
|
|
@ -52,7 +52,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal
|
||||||
var response = context.HttpContext.Response;
|
var response = context.HttpContext.Response;
|
||||||
|
|
||||||
response.StatusCode = StatusCode;
|
response.StatusCode = StatusCode;
|
||||||
context.Result = RuleTermination.ResponseComplete;
|
context.Result = RuleResult.EndResponse;
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(newPath))
|
if (string.IsNullOrEmpty(newPath))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -6,12 +6,12 @@ using Microsoft.AspNetCore.Http;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Rewrite.Internal
|
namespace Microsoft.AspNetCore.Rewrite.Internal
|
||||||
{
|
{
|
||||||
public class RedirectToHttpsRule : Rule
|
public class RedirectToHttpsRule : IRule
|
||||||
{
|
{
|
||||||
public int? SSLPort { get; set; }
|
public int? SSLPort { get; set; }
|
||||||
public int StatusCode { get; set; }
|
public int StatusCode { get; set; }
|
||||||
|
|
||||||
public override void ApplyRule(RewriteContext context)
|
public virtual void ApplyRule(RewriteContext context)
|
||||||
{
|
{
|
||||||
if (!context.HttpContext.Request.IsHttps)
|
if (!context.HttpContext.Request.IsHttps)
|
||||||
{
|
{
|
||||||
|
|
@ -31,7 +31,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal
|
||||||
|
|
||||||
var newUrl = new StringBuilder().Append("https://").Append(host).Append(req.PathBase).Append(req.Path).Append(req.QueryString);
|
var newUrl = new StringBuilder().Append("https://").Append(host).Append(req.PathBase).Append(req.Path).Append(req.QueryString);
|
||||||
context.HttpContext.Response.Redirect(newUrl.ToString());
|
context.HttpContext.Response.Redirect(newUrl.ToString());
|
||||||
context.Result = RuleTermination.ResponseComplete;
|
context.Result = RuleResult.EndResponse;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Http.Extensions;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Rewrite.Internal
|
namespace Microsoft.AspNetCore.Rewrite.Internal
|
||||||
{
|
{
|
||||||
public class RewriteRule : Rule
|
public class RewriteRule : IRule
|
||||||
{
|
{
|
||||||
private readonly TimeSpan _regexTimeout = TimeSpan.FromSeconds(1);
|
private readonly TimeSpan _regexTimeout = TimeSpan.FromSeconds(1);
|
||||||
public Regex InitialMatch { get; }
|
public Regex InitialMatch { get; }
|
||||||
|
|
@ -31,7 +31,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal
|
||||||
StopProcessing = stopProcessing;
|
StopProcessing = stopProcessing;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void ApplyRule(RewriteContext context)
|
public virtual void ApplyRule(RewriteContext context)
|
||||||
{
|
{
|
||||||
var path = context.HttpContext.Request.Path;
|
var path = context.HttpContext.Request.Path;
|
||||||
Match initMatchResults;
|
Match initMatchResults;
|
||||||
|
|
@ -51,7 +51,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal
|
||||||
|
|
||||||
if (StopProcessing)
|
if (StopProcessing)
|
||||||
{
|
{
|
||||||
context.Result = RuleTermination.StopRules;
|
context.Result = RuleResult.SkipRemainingRules;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(result))
|
if (string.IsNullOrEmpty(result))
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlActions
|
||||||
public override void ApplyAction(RewriteContext context, MatchResults ruleMatch, MatchResults condMatch)
|
public override void ApplyAction(RewriteContext context, MatchResults ruleMatch, MatchResults condMatch)
|
||||||
{
|
{
|
||||||
context.HttpContext.Response.StatusCode = StatusCodes.Status403Forbidden;
|
context.HttpContext.Response.StatusCode = StatusCodes.Status403Forbidden;
|
||||||
context.Result = RuleTermination.ResponseComplete;
|
context.Result = RuleResult.EndResponse;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlActions
|
||||||
public override void ApplyAction(RewriteContext context, MatchResults ruleMatch, MatchResults condMatch)
|
public override void ApplyAction(RewriteContext context, MatchResults ruleMatch, MatchResults condMatch)
|
||||||
{
|
{
|
||||||
context.HttpContext.Response.StatusCode = StatusCodes.Status410Gone;
|
context.HttpContext.Response.StatusCode = StatusCodes.Status410Gone;
|
||||||
context.Result = RuleTermination.ResponseComplete;
|
context.Result = RuleResult.EndResponse;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -91,7 +91,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlActions
|
||||||
response.Headers[HeaderNames.Location] = pathBase + pattern + context.HttpContext.Request.QueryString;
|
response.Headers[HeaderNames.Location] = pathBase + pattern + context.HttpContext.Request.QueryString;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
context.Result = RuleTermination.ResponseComplete;
|
context.Result = RuleResult.EndResponse;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,13 +9,13 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlActions
|
||||||
{
|
{
|
||||||
public class RewriteAction : UrlAction
|
public class RewriteAction : UrlAction
|
||||||
{
|
{
|
||||||
public RuleTermination Result { get; }
|
public RuleResult Result { get; }
|
||||||
public bool QueryStringAppend { get; }
|
public bool QueryStringAppend { get; }
|
||||||
public bool QueryStringDelete { get; }
|
public bool QueryStringDelete { get; }
|
||||||
public bool EscapeBackReferences { get; }
|
public bool EscapeBackReferences { get; }
|
||||||
|
|
||||||
public RewriteAction(
|
public RewriteAction(
|
||||||
RuleTermination result,
|
RuleResult result,
|
||||||
Pattern pattern,
|
Pattern pattern,
|
||||||
bool queryStringAppend,
|
bool queryStringAppend,
|
||||||
bool queryStringDelete,
|
bool queryStringDelete,
|
||||||
|
|
@ -31,7 +31,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlActions
|
||||||
}
|
}
|
||||||
|
|
||||||
public RewriteAction(
|
public RewriteAction(
|
||||||
RuleTermination result,
|
RuleResult result,
|
||||||
Pattern pattern,
|
Pattern pattern,
|
||||||
bool queryStringAppend) :
|
bool queryStringAppend) :
|
||||||
this(result,
|
this(result,
|
||||||
|
|
|
||||||
|
|
@ -5,9 +5,9 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlActions
|
||||||
{
|
{
|
||||||
public class VoidAction : UrlAction
|
public class VoidAction : UrlAction
|
||||||
{
|
{
|
||||||
public RuleTermination Result { get; }
|
public RuleResult Result { get; }
|
||||||
|
|
||||||
public VoidAction(RuleTermination result)
|
public VoidAction(RuleResult result)
|
||||||
{
|
{
|
||||||
Result = result;
|
Result = result;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Rewrite;
|
||||||
namespace Microsoft.AspNetCore.Builder
|
namespace Microsoft.AspNetCore.Builder
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Extension methods for the <see cref="RewriteMiddleware"/>
|
/// Extension methods for the <see cref="RewriteMiddleware"/>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static class RewriteBuilderExtensions
|
public static class RewriteBuilderExtensions
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -24,17 +24,16 @@ namespace Microsoft.AspNetCore.Rewrite
|
||||||
public IFileProvider StaticFileProvider { get; set; }
|
public IFileProvider StaticFileProvider { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets and sets the logger
|
/// Gets and sets the logger
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ILogger Logger { get; set; }
|
public ILogger Logger { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A shared result that is set appropriately by each rule for the next action that
|
/// A shared result that is set appropriately by each rule for the next action that
|
||||||
/// should be take. See <see cref="RuleTermination"/>
|
/// should be taken. See <see cref="RuleResult"/>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public RuleTermination Result { get; set; }
|
public RuleResult Result { get; set; }
|
||||||
|
|
||||||
// PERF: share the same string builder per request
|
|
||||||
internal StringBuilder Builder { get; set; } = new StringBuilder(64);
|
internal StringBuilder Builder { get; set; } = new StringBuilder(64);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,7 @@ namespace Microsoft.AspNetCore.Rewrite
|
||||||
HttpContext = context,
|
HttpContext = context,
|
||||||
StaticFileProvider = _fileProvider,
|
StaticFileProvider = _fileProvider,
|
||||||
Logger = _logger,
|
Logger = _logger,
|
||||||
Result = RuleTermination.Continue
|
Result = RuleResult.ContinueRules
|
||||||
};
|
};
|
||||||
|
|
||||||
foreach (var rule in _options.Rules)
|
foreach (var rule in _options.Rules)
|
||||||
|
|
@ -77,15 +77,15 @@ namespace Microsoft.AspNetCore.Rewrite
|
||||||
rule.ApplyRule(rewriteContext);
|
rule.ApplyRule(rewriteContext);
|
||||||
switch (rewriteContext.Result)
|
switch (rewriteContext.Result)
|
||||||
{
|
{
|
||||||
case RuleTermination.Continue:
|
case RuleResult.ContinueRules:
|
||||||
_logger.RewriteMiddlewareRequestContinueResults();
|
_logger.RewriteMiddlewareRequestContinueResults();
|
||||||
break;
|
break;
|
||||||
case RuleTermination.ResponseComplete:
|
case RuleResult.EndResponse:
|
||||||
_logger.RewriteMiddlewareRequestResponseComplete(
|
_logger.RewriteMiddlewareRequestResponseComplete(
|
||||||
context.Response.Headers[HeaderNames.Location],
|
context.Response.Headers[HeaderNames.Location],
|
||||||
context.Response.StatusCode);
|
context.Response.StatusCode);
|
||||||
return TaskCache.CompletedTask;
|
return TaskCache.CompletedTask;
|
||||||
case RuleTermination.StopRules:
|
case RuleResult.SkipRemainingRules:
|
||||||
_logger.RewriteMiddlewareRequestStopRules();
|
_logger.RewriteMiddlewareRequestStopRules();
|
||||||
return _next(context);
|
return _next(context);
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
|
|
@ -8,14 +8,14 @@ using Microsoft.AspNetCore.Hosting;
|
||||||
namespace Microsoft.AspNetCore.Rewrite
|
namespace Microsoft.AspNetCore.Rewrite
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Options for the <see cref="RewriteMiddleware"/>
|
/// Options for the <see cref="RewriteMiddleware"/>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class RewriteOptions
|
public class RewriteOptions
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A list of <see cref="Rule"/> that will be applied in order upon a request.
|
/// A list of <see cref="IRule"/> that will be applied in order upon a request.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public IList<Rule> Rules { get; } = new List<Rule>();
|
public IList<IRule> Rules { get; } = new List<IRule>();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets and sets the File Provider for file and directory checks. Defaults to <see cref="IHostingEnvironment.WebRootFileProvider"/>
|
/// Gets and sets the File Provider for file and directory checks. Defaults to <see cref="IHostingEnvironment.WebRootFileProvider"/>
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ namespace Microsoft.AspNetCore.Rewrite
|
||||||
/// <param name="options">The <see cref="RewriteOptions"/>.</param>
|
/// <param name="options">The <see cref="RewriteOptions"/>.</param>
|
||||||
/// <param name="rule">A rule to be added to the current rules.</param>
|
/// <param name="rule">A rule to be added to the current rules.</param>
|
||||||
/// <returns>The Rewrite options.</returns>
|
/// <returns>The Rewrite options.</returns>
|
||||||
public static RewriteOptions Add(this RewriteOptions options, Rule rule)
|
public static RewriteOptions Add(this RewriteOptions options, IRule rule)
|
||||||
{
|
{
|
||||||
options.Rules.Add(rule);
|
options.Rules.Add(rule);
|
||||||
return options;
|
return options;
|
||||||
|
|
@ -44,7 +44,7 @@ namespace Microsoft.AspNetCore.Rewrite
|
||||||
/// <returns>The Rewrite options.</returns>
|
/// <returns>The Rewrite options.</returns>
|
||||||
public static RewriteOptions AddRewrite(this RewriteOptions options, string regex, string replacement)
|
public static RewriteOptions AddRewrite(this RewriteOptions options, string regex, string replacement)
|
||||||
{
|
{
|
||||||
return AddRewrite(options, regex, replacement, stopProcessing: false);
|
return AddRewrite(options, regex, replacement, skipRemainingRules: false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
@ -53,11 +53,11 @@ namespace Microsoft.AspNetCore.Rewrite
|
||||||
/// <param name="options">The <see cref="RewriteOptions"/>.</param>
|
/// <param name="options">The <see cref="RewriteOptions"/>.</param>
|
||||||
/// <param name="regex">The regex string to compare with.</param>
|
/// <param name="regex">The regex string to compare with.</param>
|
||||||
/// <param name="replacement">If the regex matches, what to replace the uri with.</param>
|
/// <param name="replacement">If the regex matches, what to replace the uri with.</param>
|
||||||
/// <param name="stopProcessing">If the regex matches, conditionally stop processing other rules.</param>
|
/// <param name="skipRemainingRules">If the regex matches, conditionally stop processing other rules.</param>
|
||||||
/// <returns>The Rewrite options.</returns>
|
/// <returns>The Rewrite options.</returns>
|
||||||
public static RewriteOptions AddRewrite(this RewriteOptions options, string regex, string replacement, bool stopProcessing)
|
public static RewriteOptions AddRewrite(this RewriteOptions options, string regex, string replacement, bool skipRemainingRules)
|
||||||
{
|
{
|
||||||
options.Rules.Add(new RewriteRule(regex, replacement, stopProcessing));
|
options.Rules.Add(new RewriteRule(regex, replacement, skipRemainingRules));
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,19 +6,19 @@ namespace Microsoft.AspNetCore.Rewrite
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// An enum representing the result of a rule.
|
/// An enum representing the result of a rule.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public enum RuleTermination
|
public enum RuleResult
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Default value, continue applying rules.
|
/// Default value, continue applying rules.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
Continue,
|
ContinueRules,
|
||||||
///<summary>
|
///<summary>
|
||||||
/// Redirect occured, should send back new rewritten url.
|
/// The rule ended the request by providing a response.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
ResponseComplete,
|
EndResponse,
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Stop applying rules and send context to the next middleware
|
/// Stop applying rules and send context to the next middleware
|
||||||
/// </summary>
|
/// </summary>
|
||||||
StopRules
|
SkipRemainingRules
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -147,7 +147,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return new IISUrlRewriteRule(name, new RegexMatch(new Regex("^OFF$"), false), conditions,
|
return new IISUrlRewriteRule(name, new RegexMatch(new Regex("^OFF$"), false), conditions,
|
||||||
new RewriteAction(RuleTermination.Continue, new InputParser().ParseInputString(url), queryStringAppend: false));
|
new RewriteAction(RuleResult.ContinueRules, new InputParser().ParseInputString(url), queryStringAppend: false));
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO make rules comparable?
|
// TODO make rules comparable?
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ using Xunit;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
|
namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
|
||||||
{
|
{
|
||||||
// TODO add more of these
|
// TODO add more of these
|
||||||
public class UrlRewriteApplicationTests
|
public class UrlRewriteApplicationTests
|
||||||
{
|
{
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|
@ -17,10 +17,10 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
|
||||||
{
|
{
|
||||||
var xml = new StringReader(@"<rewrite>
|
var xml = new StringReader(@"<rewrite>
|
||||||
<rules>
|
<rules>
|
||||||
<rule name=""Test"" stopProcessing=""true"">
|
<rule name=""Test"" stopProcessing=""true"">
|
||||||
<match url = ""(.*)""/>
|
<match url = ""(.*)""/>
|
||||||
<action type = ""None""/>
|
<action type = ""None""/>
|
||||||
</rule>
|
</rule>
|
||||||
</rules>
|
</rules>
|
||||||
</rewrite>");
|
</rewrite>");
|
||||||
var rules = new UrlRewriteFileParser().Parse(xml);
|
var rules = new UrlRewriteFileParser().Parse(xml);
|
||||||
|
|
@ -28,7 +28,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
|
||||||
Assert.Equal(rules.Count, 1);
|
Assert.Equal(rules.Count, 1);
|
||||||
var context = new RewriteContext { HttpContext = new DefaultHttpContext() };
|
var context = new RewriteContext { HttpContext = new DefaultHttpContext() };
|
||||||
rules.FirstOrDefault().ApplyRule(context);
|
rules.FirstOrDefault().ApplyRule(context);
|
||||||
Assert.Equal(context.Result, RuleTermination.StopRules);
|
Assert.Equal(context.Result, RuleResult.SkipRemainingRules);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|
@ -39,7 +39,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
|
||||||
<rule name=""Test"">
|
<rule name=""Test"">
|
||||||
<match url = ""(.*)"" ignoreCase=""false"" />
|
<match url = ""(.*)"" ignoreCase=""false"" />
|
||||||
<action type = ""None""/>
|
<action type = ""None""/>
|
||||||
</rule>
|
</rule>
|
||||||
</rules>
|
</rules>
|
||||||
</rewrite>");
|
</rewrite>");
|
||||||
var rules = new UrlRewriteFileParser().Parse(xml);
|
var rules = new UrlRewriteFileParser().Parse(xml);
|
||||||
|
|
@ -47,7 +47,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
|
||||||
Assert.Equal(rules.Count, 1);
|
Assert.Equal(rules.Count, 1);
|
||||||
var context = new RewriteContext { HttpContext = new DefaultHttpContext() };
|
var context = new RewriteContext { HttpContext = new DefaultHttpContext() };
|
||||||
rules.FirstOrDefault().ApplyRule(context);
|
rules.FirstOrDefault().ApplyRule(context);
|
||||||
Assert.Equal(context.Result, RuleTermination.Continue);
|
Assert.Equal(context.Result, RuleResult.ContinueRules);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlActions
|
||||||
action.ApplyAction(context, null, null);
|
action.ApplyAction(context, null, null);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.Equal(context.Result, RuleTermination.ResponseComplete);
|
Assert.Equal(context.Result, RuleResult.EndResponse);
|
||||||
Assert.Equal(context.HttpContext.Response.StatusCode, StatusCodes.Status403Forbidden);
|
Assert.Equal(context.HttpContext.Response.StatusCode, StatusCodes.Status403Forbidden);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlActions
|
||||||
action.ApplyAction(context, null, null);
|
action.ApplyAction(context, null, null);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.Equal(context.Result, RuleTermination.ResponseComplete);
|
Assert.Equal(context.Result, RuleResult.EndResponse);
|
||||||
Assert.Equal(context.HttpContext.Response.StatusCode, StatusCodes.Status410Gone);
|
Assert.Equal(context.HttpContext.Response.StatusCode, StatusCodes.Status410Gone);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue