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 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; _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? SSLPort { get; set; }
public int StatusCode { get; set; } public int StatusCode { get; set; }
public override RuleResult ApplyRule(RewriteContext context) public override void ApplyRule(RewriteContext context)
{ {
if (!context.HttpContext.Request.IsHttps) 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); 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());
return RuleResult.ResponseComplete; context.Result = RuleTermination.ResponseComplete;
} }
return RuleResult.Continue;
} }
} }
} }

View File

@ -28,7 +28,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
EscapeBackReferences = escapeBackReferences; 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); var pattern = Url.Evaluate(context, ruleMatch, condMatch);
if (EscapeBackReferences) if (EscapeBackReferences)
@ -64,7 +64,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
context.HttpContext.Response.Headers[HeaderNames.Location] = pattern + context.HttpContext.Request.QueryString; 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 public class ModRewriteRewriteAction : UrlAction
{ {
private readonly string ForwardSlash = "/"; private readonly string ForwardSlash = "/";
public RuleResult Result { get; } public RuleTermination 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 ModRewriteRewriteAction( public ModRewriteRewriteAction(
RuleResult result, RuleTermination result,
Pattern pattern, Pattern pattern,
bool queryStringAppend, bool queryStringAppend,
bool queryStringDelete, bool queryStringDelete,
@ -29,7 +29,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ModRewrite
EscapeBackReferences = escapeBackReferences; 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); 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 else
{ {
var last = flags.HasFlag(FlagType.End) || flags.HasFlag(FlagType.Last); var last = flags.HasFlag(FlagType.End) || flags.HasFlag(FlagType.Last);
var redirect = last ? RuleResult.StopRules : RuleResult.Continue; var termination = last ? RuleTermination.StopRules : RuleTermination.Continue;
_action = new ModRewriteRewriteAction(redirect, pattern, queryStringAppend, queryStringDelete, escapeBackReference); _action = new ModRewriteRewriteAction(termination, pattern, queryStringAppend, queryStringDelete, escapeBackReference);
} }
} }
} }

View File

@ -21,7 +21,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal
PreActions = preActions; 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. // 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);
@ -29,7 +29,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal
if (!initMatchRes.Success) if (!initMatchRes.Success)
{ {
context.Logger?.ModRewriteDidNotMatchRule(); context.Logger?.ModRewriteDidNotMatchRule();
return RuleResult.Continue; return;
} }
MatchResults condMatchRes = null; MatchResults condMatchRes = null;
@ -39,7 +39,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal
if (!condMatchRes.Success) if (!condMatchRes.Success)
{ {
context.Logger?.ModRewriteDidNotMatchRule(); context.Logger?.ModRewriteDidNotMatchRule();
return RuleResult.Continue; return;
} }
} }
@ -51,7 +51,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal
preAction.ApplyAction(context.HttpContext, initMatchRes, condMatchRes); 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 public abstract class UrlAction
{ {
protected Pattern Url { get; set; } 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 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; 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 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; 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; 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); var pattern = Url.Evaluate(context, ruleMatch, condMatch);
context.HttpContext.Response.StatusCode = StatusCode; context.HttpContext.Response.StatusCode = StatusCode;
@ -46,7 +46,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.UrlActions
{ {
context.HttpContext.Response.Headers[HeaderNames.Location] = pattern; 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; 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); 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 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 // 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) switch (actionType)
{ {
case ActionType.None: case ActionType.None:
_action = new VoidAction(stopProcessing ? RuleResult.StopRules : RuleResult.Continue); _action = new VoidAction(stopProcessing ? RuleTermination.StopRules : RuleTermination.Continue);
break; break;
case ActionType.Rewrite: case ActionType.Rewrite:
_action = new RewriteAction(stopProcessing ? RuleTermination.StopRules : RuleTermination.Continue, _action = new RewriteAction(stopProcessing ? RuleTermination.StopRules : RuleTermination.Continue,

View File

@ -25,7 +25,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal
Action = action; Action = action;
} }
public override RuleResult ApplyRule(RewriteContext context) public override 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
@ -43,7 +43,7 @@ namespace Microsoft.AspNetCore.Rewrite.Internal
if (!initMatchResults.Success) if (!initMatchResults.Success)
{ {
context.Logger?.UrlRewriteDidNotMatchRule(Name); context.Logger?.UrlRewriteDidNotMatchRule(Name);
return RuleResult.Continue; return;
} }
MatchResults condMatchRes = null; MatchResults condMatchRes = null;
@ -53,13 +53,13 @@ namespace Microsoft.AspNetCore.Rewrite.Internal
if (!condMatchRes.Success) if (!condMatchRes.Success)
{ {
context.Logger?.UrlRewriteDidNotMatchRule(Name); context.Logger?.UrlRewriteDidNotMatchRule(Name);
return RuleResult.Continue; return;
} }
} }
context.Logger?.UrlRewriteMatchedRule(Name); context.Logger?.UrlRewriteMatchedRule(Name);
// at this point we know the rule passed, evaluate the replacement. // 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 HttpContext HttpContext { get; set; }
public IFileProvider StaticFileProvider { get; set; } public IFileProvider StaticFileProvider { get; set; }
public ILogger Logger { get; set; } public ILogger Logger { get; set; }
public RuleTermination Result { get; set; }
// PERF: share the same string builder per request // PERF: share the same string builder per request
internal StringBuilder Builder { get; set; } = new StringBuilder(64); internal StringBuilder Builder { get; set; } = new StringBuilder(64);
} }

View File

@ -65,30 +65,31 @@ namespace Microsoft.AspNetCore.Rewrite
{ {
throw new ArgumentNullException(nameof(context)); throw new ArgumentNullException(nameof(context));
} }
var urlContext = new RewriteContext { var rewriteContext = new RewriteContext {
HttpContext = context, HttpContext = context,
StaticFileProvider = _fileProvider, StaticFileProvider = _fileProvider,
Logger = _logger Logger = _logger,
Result = RuleTermination.Continue
}; };
foreach (var rule in _options.Rules) foreach (var rule in _options.Rules)
{ {
var result = rule.ApplyRule(urlContext); rule.ApplyRule(rewriteContext);
switch (result.Result) switch (rewriteContext.Result)
{ {
case RuleTermination.Continue: case RuleTermination.Continue:
_logger.RewriteMiddlewareRequestContinueResults(); _logger.RewriteMiddlewareRequestContinueResults();
break; break;
case RuleTermination.ResponseComplete: case RuleTermination.ResponseComplete:
_logger.RewriteMiddlewareRequestResponseComplete( _logger.RewriteMiddlewareRequestResponseComplete(
urlContext.HttpContext.Response.Headers[HeaderNames.Location], context.Response.Headers[HeaderNames.Location],
urlContext.HttpContext.Response.StatusCode); context.Response.StatusCode);
return CompletedTask; return CompletedTask;
case RuleTermination.StopRules: case RuleTermination.StopRules:
_logger.RewriteMiddlewareRequestStopRules(); _logger.RewriteMiddlewareRequestStopRules();
return _next(context); return _next(context);
default: default:
throw new ArgumentOutOfRangeException($"Invalid rule termination {result}"); throw new ArgumentOutOfRangeException($"Invalid rule termination {rewriteContext.Result}");
} }
} }
return _next(context); return _next(context);

View File

@ -31,7 +31,7 @@ namespace Microsoft.AspNetCore.Rewrite
/// <param name="options">The Rewrite options.</param> /// <param name="options">The Rewrite options.</param>
/// <param name="applyRule">A Func that checks and applies the rule.</param> /// <param name="applyRule">A Func that checks and applies the rule.</param>
/// <returns></returns> /// <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)); options.Rules.Add(new DelegateRule(applyRule));
return options; return options;

View File

@ -4,9 +4,10 @@
namespace Microsoft.AspNetCore.Rewrite namespace Microsoft.AspNetCore.Rewrite
{ {
// make this public and doc comements // make this public and doc comements
// caller must set the context.Results field appropriately in rule.
public abstract class 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. // 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.Http;
using Microsoft.AspNetCore.Rewrite.Internal;
using Microsoft.AspNetCore.Rewrite.Internal.UrlActions; using Microsoft.AspNetCore.Rewrite.Internal.UrlActions;
using Xunit; using Xunit;
@ -18,10 +17,10 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlActions
var action = new ForbiddenAction(); var action = new ForbiddenAction();
// Act // Act
var results = action.ApplyAction(context, null, null); action.ApplyAction(context, null, null);
// Assert // Assert
Assert.Equal(results.Result, RuleTermination.ResponseComplete); Assert.Equal(context.Result, RuleTermination.ResponseComplete);
Assert.Equal(context.HttpContext.Response.StatusCode, StatusCodes.Status403Forbidden); 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. // 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.Http;
using Microsoft.AspNetCore.Rewrite.Internal;
using Microsoft.AspNetCore.Rewrite.Internal.UrlActions; using Microsoft.AspNetCore.Rewrite.Internal.UrlActions;
using Xunit; using Xunit;
@ -18,10 +17,10 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlActions
var action = new GoneAction(); var action = new GoneAction();
// Act // Act
var results = action.ApplyAction(context, null, null); action.ApplyAction(context, null, null);
// Assert // Assert
Assert.Equal(results.Result, RuleTermination.ResponseComplete); Assert.Equal(context.Result, RuleTermination.ResponseComplete);
Assert.Equal(context.HttpContext.Response.StatusCode, StatusCodes.Status410Gone); Assert.Equal(context.HttpContext.Response.StatusCode, StatusCodes.Status410Gone);
} }
} }

View File

@ -24,10 +24,11 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
</rules> </rules>
</rewrite>"); </rewrite>");
var rules = new UrlRewriteFileParser().Parse(xml); var rules = new UrlRewriteFileParser().Parse(xml);
Assert.Equal(rules.Count, 1); Assert.Equal(rules.Count, 1);
var ruleResults = rules.FirstOrDefault().ApplyRule(new RewriteContext {HttpContext = new DefaultHttpContext()}); var context = new RewriteContext { HttpContext = new DefaultHttpContext() };
Assert.Equal(ruleResults.Result, RuleTermination.StopRules); rules.FirstOrDefault().ApplyRule(context);
Assert.Equal(context.Result, RuleTermination.StopRules);
} }
[Fact] [Fact]
@ -44,8 +45,9 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
var rules = new UrlRewriteFileParser().Parse(xml); var rules = new UrlRewriteFileParser().Parse(xml);
Assert.Equal(rules.Count, 1); Assert.Equal(rules.Count, 1);
var ruleResults = rules.FirstOrDefault().ApplyRule(new RewriteContext { HttpContext = new DefaultHttpContext() }); var context = new RewriteContext { HttpContext = new DefaultHttpContext() };
Assert.Equal(ruleResults.Result, RuleTermination.Continue); rules.FirstOrDefault().ApplyRule(context);
Assert.Equal(context.Result, RuleTermination.Continue);
} }
} }
} }