54 lines
2.0 KiB
C#
54 lines
2.0 KiB
C#
// 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.Collections.Generic;
|
|
using Microsoft.AspNetCore.Rewrite.Logging;
|
|
|
|
namespace Microsoft.AspNetCore.Rewrite.Internal.ApacheModRewrite
|
|
{
|
|
public class ApacheModRewriteRule : IRule
|
|
{
|
|
public UrlMatch InitialMatch { get; }
|
|
public IList<Condition> Conditions { get; }
|
|
public IList<UrlAction> Actions { get; }
|
|
|
|
public ApacheModRewriteRule(UrlMatch initialMatch, IList<Condition> conditions, IList<UrlAction> urlActions)
|
|
{
|
|
Conditions = conditions;
|
|
InitialMatch = initialMatch;
|
|
Actions = urlActions;
|
|
}
|
|
|
|
public virtual 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);
|
|
|
|
if (!initMatchRes.Success)
|
|
{
|
|
context.Logger?.ModRewriteDidNotMatchRule();
|
|
return;
|
|
}
|
|
|
|
BackReferenceCollection condBackReferences = null;
|
|
if (Conditions != null)
|
|
{
|
|
var condResult = ConditionEvaluator.Evaluate(Conditions, context, initMatchRes.BackReferences);
|
|
if (!condResult.Success)
|
|
{
|
|
context.Logger?.ModRewriteDidNotMatchRule();
|
|
return;
|
|
}
|
|
}
|
|
|
|
// At this point, we know our rule passed, first apply pre conditions,
|
|
// which can modify things like the cookie or env, and then apply the action
|
|
context.Logger?.ModRewriteMatchedRule();
|
|
|
|
foreach (var action in Actions)
|
|
{
|
|
action.ApplyAction(context, initMatchRes?.BackReferences, condBackReferences);
|
|
}
|
|
}
|
|
}
|
|
} |