File: ApacheModRewrite\ConditionEvaluator.cs
Web Access
Project: src\src\Middleware\Rewrite\src\Microsoft.AspNetCore.Rewrite.csproj (Microsoft.AspNetCore.Rewrite)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Diagnostics;
 
namespace Microsoft.AspNetCore.Rewrite.ApacheModRewrite;
 
internal static class ConditionEvaluator
{
    public static MatchResults Evaluate(IEnumerable<Condition> conditions, RewriteContext context, BackReferenceCollection? backReferences)
    {
        return Evaluate(conditions, context, backReferences, trackAllCaptures: false);
    }
 
    public static MatchResults Evaluate(IEnumerable<Condition> conditions, RewriteContext context, BackReferenceCollection? backReferences, bool trackAllCaptures)
    {
        BackReferenceCollection? prevBackReferences = null;
        MatchResults? condResult = null;
        var orSucceeded = false;
        foreach (var condition in conditions)
        {
            if (orSucceeded && condition.OrNext)
            {
                continue;
            }
            else if (orSucceeded)
            {
                orSucceeded = false;
                continue;
            }
 
            condResult = condition.Evaluate(context, backReferences, prevBackReferences);
            var currentBackReferences = condResult.BackReferences;
            if (condition.OrNext)
            {
                orSucceeded = condResult.Success;
            }
            else if (!condResult.Success)
            {
                return condResult;
            }
 
            if (condResult.Success && trackAllCaptures && prevBackReferences != null)
            {
                prevBackReferences.Add(condResult.BackReferences);
                currentBackReferences = prevBackReferences;
            }
 
            prevBackReferences = currentBackReferences;
        }
 
        Debug.Assert(condResult != null, "ConditionEvaluator must be passed at least one condition to evaluate.");
        return new MatchResults(condResult.Success, prevBackReferences);
    }
}