Remove RuleResult, added to context.

This commit is contained in:
Justin Kotalik 2016-08-28 22:05:44 -07:00
parent f3b4658c2c
commit 28133b6808
22 changed files with 59 additions and 71 deletions

View File

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

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

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

View File

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

View File

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

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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,

View File

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

View File

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

View File

@ -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);

View File

@ -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;

View File

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

View File

@ -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; }
}
}

View File

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

View File

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

View File

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