File: IISUrlRewrite\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.

namespace Microsoft.AspNetCore.Rewrite.IISUrlRewrite;

internal static class ConditionEvaluator
{
    public static MatchResults Evaluate(ConditionCollection conditions, RewriteContext context, BackReferenceCollection? backReferences)
    {
        BackReferenceCollection? prevBackReferences = null;
        MatchResults? condResult = null;
        var orSucceeded = false;
        foreach (var condition in conditions)
        {
            if (orSucceeded && conditions.Grouping == LogicalGrouping.MatchAny)
            {
                continue;
            }

            if (orSucceeded)
            {
                orSucceeded = false;
                continue;
            }

            condResult = condition.Evaluate(context, backReferences, prevBackReferences);
            var currentBackReferences = condResult.BackReferences;
            if (conditions.Grouping == LogicalGrouping.MatchAny)
            {
                orSucceeded = condResult.Success;
            }
            else if (!condResult.Success)
            {
                return condResult;
            }

            if (condResult.Success && conditions.TrackAllCaptures && prevBackReferences != null)
            {
                prevBackReferences.Add(currentBackReferences!);
                currentBackReferences = prevBackReferences;
            }

            prevBackReferences = currentBackReferences;
        }

        return new MatchResults(condResult!.Success, prevBackReferences);
    }
}