File: ApacheModRewrite\ConditionEvaluator.cs
Web Access
Project: src\aspnetcore\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);
    }
}