Remove RuleResult, added to context.
This commit is contained in:
parent
f3b4658c2c
commit
28133b6808
|
|
@ -7,12 +7,12 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.CodeRules
|
|||
{
|
||||
public class DelegateRule : Rule
|
||||
{
|
||||
private readonly Func<RewriteContext, RuleResult> _onApplyRule;
|
||||
private readonly Action<RewriteContext> _onApplyRule;
|
||||
|
||||
public DelegateRule(Func<RewriteContext, RuleResult> onApplyRule)
|
||||
public DelegateRule(Action<RewriteContext> onApplyRule)
|
||||
{
|
||||
_onApplyRule = onApplyRule;
|
||||
}
|
||||
public override RuleResult ApplyRule(RewriteContext context) => _onApplyRule(context);
|
||||
public override void ApplyRule(RewriteContext context) => _onApplyRule(context);
|
||||
}
|
||||
}
|
||||
|
|
@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.CodeRules
|
|||
public int? SSLPort { get; set; }
|
||||
public int StatusCode { get; set; }
|
||||
|
||||
public override RuleResult ApplyRule(RewriteContext context)
|
||||
public override void ApplyRule(RewriteContext context)
|
||||
{
|
||||
if (!context.HttpContext.Request.IsHttps)
|
||||
{
|
||||
|
|
@ -31,9 +31,8 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.CodeRules
|
|||
|
||||
var newUrl = new StringBuilder().Append("https://").Append(host).Append(req.PathBase).Append(req.Path).Append(req.QueryString);
|
||||
context.HttpContext.Response.Redirect(newUrl.ToString());
|
||||
return RuleResult.ResponseComplete;
|
||||
context.Result = RuleTermination.ResponseComplete;
|
||||
}
|
||||
return RuleResult.Continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -28,7 +28,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
|||
EscapeBackReferences = escapeBackReferences;
|
||||
}
|
||||
|
||||
public override RuleResult ApplyAction(RewriteContext context, MatchResults ruleMatch, MatchResults condMatch)
|
||||
public override void ApplyAction(RewriteContext context, MatchResults ruleMatch, MatchResults condMatch)
|
||||
{
|
||||
var pattern = Url.Evaluate(context, ruleMatch, condMatch);
|
||||
if (EscapeBackReferences)
|
||||
|
|
@ -64,7 +64,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
|||
context.HttpContext.Response.Headers[HeaderNames.Location] = pattern + context.HttpContext.Request.QueryString;
|
||||
}
|
||||
}
|
||||
return RuleResult.ResponseComplete;
|
||||
context.Result = RuleTermination.ResponseComplete;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,13 +10,13 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
|||
public class ModRewriteRewriteAction : UrlAction
|
||||
{
|
||||
private readonly string ForwardSlash = "/";
|
||||
public RuleResult Result { get; }
|
||||
public RuleTermination Result { get; }
|
||||
public bool QueryStringAppend { get; }
|
||||
public bool QueryStringDelete { get; }
|
||||
public bool EscapeBackReferences { get; }
|
||||
|
||||
public ModRewriteRewriteAction(
|
||||
RuleResult result,
|
||||
RuleTermination result,
|
||||
Pattern pattern,
|
||||
bool queryStringAppend,
|
||||
bool queryStringDelete,
|
||||
|
|
@ -29,7 +29,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
|||
EscapeBackReferences = escapeBackReferences;
|
||||
}
|
||||
|
||||
public override RuleResult ApplyAction(RewriteContext context, MatchResults ruleMatch, MatchResults condMatch)
|
||||
public override void ApplyAction(RewriteContext context, MatchResults ruleMatch, MatchResults condMatch)
|
||||
{
|
||||
var pattern = Url.Evaluate(context, ruleMatch, condMatch);
|
||||
|
||||
|
|
@ -107,7 +107,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
|||
}
|
||||
}
|
||||
}
|
||||
return Result;
|
||||
context.Result = Result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -215,8 +215,8 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
|
|||
else
|
||||
{
|
||||
var last = flags.HasFlag(FlagType.End) || flags.HasFlag(FlagType.Last);
|
||||
var redirect = last ? RuleResult.StopRules : RuleResult.Continue;
|
||||
_action = new ModRewriteRewriteAction(redirect, pattern, queryStringAppend, queryStringDelete, escapeBackReference);
|
||||
var termination = last ? RuleTermination.StopRules : RuleTermination.Continue;
|
||||
_action = new ModRewriteRewriteAction(termination, pattern, queryStringAppend, queryStringDelete, escapeBackReference);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal
|
|||
PreActions = preActions;
|
||||
}
|
||||
|
||||
public override RuleResult ApplyRule(RewriteContext context)
|
||||
public override void ApplyRule(RewriteContext context)
|
||||
{
|
||||
// 1. Figure out which section of the string to match for the initial rule.
|
||||
var initMatchRes = InitialMatch.Evaluate(context.HttpContext.Request.Path, context);
|
||||
|
|
@ -29,7 +29,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal
|
|||
if (!initMatchRes.Success)
|
||||
{
|
||||
context.Logger?.ModRewriteDidNotMatchRule();
|
||||
return RuleResult.Continue;
|
||||
return;
|
||||
}
|
||||
|
||||
MatchResults condMatchRes = null;
|
||||
|
|
@ -39,7 +39,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal
|
|||
if (!condMatchRes.Success)
|
||||
{
|
||||
context.Logger?.ModRewriteDidNotMatchRule();
|
||||
return RuleResult.Continue;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -51,7 +51,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal
|
|||
preAction.ApplyAction(context.HttpContext, initMatchRes, condMatchRes);
|
||||
}
|
||||
|
||||
return Action.ApplyAction(context, initMatchRes, condMatchRes);
|
||||
Action.ApplyAction(context, initMatchRes, condMatchRes);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,6 +6,6 @@ namespace Microsoft.AspNetCore.Rewrite.Internal
|
|||
public abstract class UrlAction
|
||||
{
|
||||
protected Pattern Url { get; set; }
|
||||
public abstract RuleResult ApplyAction(RewriteContext context, MatchResults ruleMatch, MatchResults condMatch);
|
||||
public abstract void ApplyAction(RewriteContext context, MatchResults ruleMatch, MatchResults condMatch);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,10 +7,10 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlActions
|
|||
{
|
||||
public class ForbiddenAction : UrlAction
|
||||
{
|
||||
public override RuleResult ApplyAction(RewriteContext context, MatchResults ruleMatch, MatchResults condMatch)
|
||||
public override void ApplyAction(RewriteContext context, MatchResults ruleMatch, MatchResults condMatch)
|
||||
{
|
||||
context.HttpContext.Response.StatusCode = StatusCodes.Status403Forbidden;
|
||||
return RuleResult.ResponseComplete;
|
||||
context.Result = RuleTermination.ResponseComplete;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,10 +7,10 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlActions
|
|||
{
|
||||
public class GoneAction : UrlAction
|
||||
{
|
||||
public override RuleResult ApplyAction(RewriteContext context, MatchResults ruleMatch, MatchResults condMatch)
|
||||
public override void ApplyAction(RewriteContext context, MatchResults ruleMatch, MatchResults condMatch)
|
||||
{
|
||||
context.HttpContext.Response.StatusCode = StatusCodes.Status410Gone;
|
||||
return RuleResult.ResponseComplete;
|
||||
context.Result = RuleTermination.ResponseComplete;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlActions
|
|||
AppendQueryString = appendQueryString;
|
||||
}
|
||||
|
||||
public override RuleResult ApplyAction(RewriteContext context, MatchResults ruleMatch, MatchResults condMatch)
|
||||
public override void ApplyAction(RewriteContext context, MatchResults ruleMatch, MatchResults condMatch)
|
||||
{
|
||||
var pattern = Url.Evaluate(context, ruleMatch, condMatch);
|
||||
context.HttpContext.Response.StatusCode = StatusCode;
|
||||
|
|
@ -46,7 +46,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlActions
|
|||
{
|
||||
context.HttpContext.Response.Headers[HeaderNames.Location] = pattern;
|
||||
}
|
||||
return RuleResult.ResponseComplete;
|
||||
context.Result = RuleTermination.ResponseComplete;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlActions
|
|||
ClearQuery = clearQuery;
|
||||
}
|
||||
|
||||
public override RuleResult ApplyAction(RewriteContext context, MatchResults ruleMatch, MatchResults condMatch)
|
||||
public override void ApplyAction(RewriteContext context, MatchResults ruleMatch, MatchResults condMatch)
|
||||
{
|
||||
var pattern = Url.Evaluate(context, ruleMatch, condMatch);
|
||||
|
||||
|
|
@ -73,7 +73,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlActions
|
|||
}
|
||||
}
|
||||
}
|
||||
return new RuleResult { Result = Result };
|
||||
context.Result = Result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,16 +5,16 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlActions
|
|||
{
|
||||
public class VoidAction : UrlAction
|
||||
{
|
||||
private readonly RuleResult _results;
|
||||
public RuleTermination Result { get; }
|
||||
|
||||
public VoidAction(RuleResult results)
|
||||
public VoidAction(RuleTermination result)
|
||||
{
|
||||
_results = results;
|
||||
Result = result;
|
||||
}
|
||||
// Explicitly say that nothing happens
|
||||
public override RuleResult ApplyAction(RewriteContext context, MatchResults ruleMatch, MatchResults condMatch)
|
||||
public override void ApplyAction(RewriteContext context, MatchResults ruleMatch, MatchResults condMatch)
|
||||
{
|
||||
return _results;
|
||||
context.Result = Result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlRewrite
|
|||
switch (actionType)
|
||||
{
|
||||
case ActionType.None:
|
||||
_action = new VoidAction(stopProcessing ? RuleResult.StopRules : RuleResult.Continue);
|
||||
_action = new VoidAction(stopProcessing ? RuleTermination.StopRules : RuleTermination.Continue);
|
||||
break;
|
||||
case ActionType.Rewrite:
|
||||
_action = new RewriteAction(stopProcessing ? RuleTermination.StopRules : RuleTermination.Continue,
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal
|
|||
Action = action;
|
||||
}
|
||||
|
||||
public override RuleResult ApplyRule(RewriteContext context)
|
||||
public override void ApplyRule(RewriteContext context)
|
||||
{
|
||||
// Due to the path string always having a leading slash,
|
||||
// remove it from the path before regex comparison
|
||||
|
|
@ -43,7 +43,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal
|
|||
if (!initMatchResults.Success)
|
||||
{
|
||||
context.Logger?.UrlRewriteDidNotMatchRule(Name);
|
||||
return RuleResult.Continue;
|
||||
return;
|
||||
}
|
||||
|
||||
MatchResults condMatchRes = null;
|
||||
|
|
@ -53,13 +53,13 @@ namespace Microsoft.AspNetCore.Rewrite.Internal
|
|||
if (!condMatchRes.Success)
|
||||
{
|
||||
context.Logger?.UrlRewriteDidNotMatchRule(Name);
|
||||
return RuleResult.Continue;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
context.Logger?.UrlRewriteMatchedRule(Name);
|
||||
// at this point we know the rule passed, evaluate the replacement.
|
||||
return Action.ApplyAction(context, initMatchResults, condMatchRes);
|
||||
Action.ApplyAction(context, initMatchResults, condMatchRes);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -17,6 +17,7 @@ namespace Microsoft.AspNetCore.Rewrite
|
|||
public HttpContext HttpContext { get; set; }
|
||||
public IFileProvider StaticFileProvider { get; set; }
|
||||
public ILogger Logger { get; set; }
|
||||
public RuleTermination Result { get; set; }
|
||||
// PERF: share the same string builder per request
|
||||
internal StringBuilder Builder { get; set; } = new StringBuilder(64);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -65,30 +65,31 @@ namespace Microsoft.AspNetCore.Rewrite
|
|||
{
|
||||
throw new ArgumentNullException(nameof(context));
|
||||
}
|
||||
var urlContext = new RewriteContext {
|
||||
var rewriteContext = new RewriteContext {
|
||||
HttpContext = context,
|
||||
StaticFileProvider = _fileProvider,
|
||||
Logger = _logger
|
||||
Logger = _logger,
|
||||
Result = RuleTermination.Continue
|
||||
};
|
||||
|
||||
foreach (var rule in _options.Rules)
|
||||
{
|
||||
var result = rule.ApplyRule(urlContext);
|
||||
switch (result.Result)
|
||||
rule.ApplyRule(rewriteContext);
|
||||
switch (rewriteContext.Result)
|
||||
{
|
||||
case RuleTermination.Continue:
|
||||
_logger.RewriteMiddlewareRequestContinueResults();
|
||||
break;
|
||||
case RuleTermination.ResponseComplete:
|
||||
_logger.RewriteMiddlewareRequestResponseComplete(
|
||||
urlContext.HttpContext.Response.Headers[HeaderNames.Location],
|
||||
urlContext.HttpContext.Response.StatusCode);
|
||||
context.Response.Headers[HeaderNames.Location],
|
||||
context.Response.StatusCode);
|
||||
return CompletedTask;
|
||||
case RuleTermination.StopRules:
|
||||
_logger.RewriteMiddlewareRequestStopRules();
|
||||
return _next(context);
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException($"Invalid rule termination {result}");
|
||||
throw new ArgumentOutOfRangeException($"Invalid rule termination {rewriteContext.Result}");
|
||||
}
|
||||
}
|
||||
return _next(context);
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ namespace Microsoft.AspNetCore.Rewrite
|
|||
/// <param name="options">The Rewrite options.</param>
|
||||
/// <param name="applyRule">A Func that checks and applies the rule.</param>
|
||||
/// <returns></returns>
|
||||
public static RewriteOptions Add(this RewriteOptions options, Func<RewriteContext, RuleResult> applyRule)
|
||||
public static RewriteOptions Add(this RewriteOptions options, Action<RewriteContext> applyRule)
|
||||
{
|
||||
options.Rules.Add(new DelegateRule(applyRule));
|
||||
return options;
|
||||
|
|
|
|||
|
|
@ -4,9 +4,10 @@
|
|||
namespace Microsoft.AspNetCore.Rewrite
|
||||
{
|
||||
// make this public and doc comements
|
||||
// caller must set the context.Results field appropriately in rule.
|
||||
public abstract class Rule
|
||||
{
|
||||
public abstract RuleResult ApplyRule(RewriteContext context);
|
||||
public abstract void ApplyRule(RewriteContext context);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,14 +0,0 @@
|
|||
// 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.
|
||||
|
||||
namespace Microsoft.AspNetCore.Rewrite
|
||||
{
|
||||
public class RuleResult
|
||||
{
|
||||
public static RuleResult Continue = new RuleResult { Result = RuleTermination.Continue };
|
||||
public static RuleResult ResponseComplete = new RuleResult { Result = RuleTermination.ResponseComplete };
|
||||
public static RuleResult StopRules = new RuleResult { Result = RuleTermination.StopRules };
|
||||
|
||||
public RuleTermination Result { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
@ -2,7 +2,6 @@
|
|||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Rewrite.Internal;
|
||||
using Microsoft.AspNetCore.Rewrite.Internal.UrlActions;
|
||||
using Xunit;
|
||||
|
||||
|
|
@ -18,10 +17,10 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlActions
|
|||
var action = new ForbiddenAction();
|
||||
|
||||
// Act
|
||||
var results = action.ApplyAction(context, null, null);
|
||||
action.ApplyAction(context, null, null);
|
||||
|
||||
// Assert
|
||||
Assert.Equal(results.Result, RuleTermination.ResponseComplete);
|
||||
Assert.Equal(context.Result, RuleTermination.ResponseComplete);
|
||||
Assert.Equal(context.HttpContext.Response.StatusCode, StatusCodes.Status403Forbidden);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Rewrite.Internal;
|
||||
using Microsoft.AspNetCore.Rewrite.Internal.UrlActions;
|
||||
using Xunit;
|
||||
|
||||
|
|
@ -18,10 +17,10 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlActions
|
|||
var action = new GoneAction();
|
||||
|
||||
// Act
|
||||
var results = action.ApplyAction(context, null, null);
|
||||
action.ApplyAction(context, null, null);
|
||||
|
||||
// Assert
|
||||
Assert.Equal(results.Result, RuleTermination.ResponseComplete);
|
||||
Assert.Equal(context.Result, RuleTermination.ResponseComplete);
|
||||
Assert.Equal(context.HttpContext.Response.StatusCode, StatusCodes.Status410Gone);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,10 +24,11 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
|
|||
</rules>
|
||||
</rewrite>");
|
||||
var rules = new UrlRewriteFileParser().Parse(xml);
|
||||
|
||||
|
||||
Assert.Equal(rules.Count, 1);
|
||||
var ruleResults = rules.FirstOrDefault().ApplyRule(new RewriteContext {HttpContext = new DefaultHttpContext()});
|
||||
Assert.Equal(ruleResults.Result, RuleTermination.StopRules);
|
||||
var context = new RewriteContext { HttpContext = new DefaultHttpContext() };
|
||||
rules.FirstOrDefault().ApplyRule(context);
|
||||
Assert.Equal(context.Result, RuleTermination.StopRules);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
|
@ -44,8 +45,9 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
|
|||
var rules = new UrlRewriteFileParser().Parse(xml);
|
||||
|
||||
Assert.Equal(rules.Count, 1);
|
||||
var ruleResults = rules.FirstOrDefault().ApplyRule(new RewriteContext { HttpContext = new DefaultHttpContext() });
|
||||
Assert.Equal(ruleResults.Result, RuleTermination.Continue);
|
||||
var context = new RewriteContext { HttpContext = new DefaultHttpContext() };
|
||||
rules.FirstOrDefault().ApplyRule(context);
|
||||
Assert.Equal(context.Result, RuleTermination.Continue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue