File: UrlMatches\StringMatch.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.UrlMatches;
 
internal sealed class StringMatch : UrlMatch
{
    private readonly string _value;
    private readonly StringOperationType _operation;
    private readonly StringComparison _stringComparison;
 
    public StringMatch(string value, StringOperationType operation, bool ignoreCase)
    {
        _value = value;
        if (operation < StringOperationType.Equal || operation > StringOperationType.LessEqual)
        {
            throw new ArgumentOutOfRangeException(nameof(operation));
        }
 
        _operation = operation;
        _stringComparison = ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal;
    }
 
    public override MatchResults Evaluate(string input, RewriteContext context)
    {
        switch (_operation)
        {
            case StringOperationType.Equal:
                return string.Compare(input, _value, _stringComparison) == 0 ? MatchResults.EmptySuccess : MatchResults.EmptyFailure;
            case StringOperationType.Greater:
                return string.Compare(input, _value, _stringComparison) > 0 ? MatchResults.EmptySuccess : MatchResults.EmptyFailure;
            case StringOperationType.GreaterEqual:
                return string.Compare(input, _value, _stringComparison) >= 0 ? MatchResults.EmptySuccess : MatchResults.EmptyFailure;
            case StringOperationType.Less:
                return string.Compare(input, _value, _stringComparison) < 0 ? MatchResults.EmptySuccess : MatchResults.EmptyFailure;
            case StringOperationType.LessEqual:
                return string.Compare(input, _value, _stringComparison) <= 0 ? MatchResults.EmptySuccess : MatchResults.EmptyFailure;
            default:
                Debug.Fail("This is never reached.");
                throw new InvalidOperationException(); // Will never be thrown
        }
    }
}