XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEExtension.NetCore.ServerInteractive

[DLL] Server interaction extension, including user identity verification and querying in conjunction with AutoConfig

公开
关注 0 Fork 0 Star 0
UTF-8
namespace XFEExtension.NetCore.ServerInteractive.Utilities.Helpers;

/// <summary>
/// 路由通配符匹配辅助类
/// </summary>
internal static class RouteMatchHelper
{
    /// <summary>
    /// 判断路由是否包含通配符
    /// </summary>
    /// <param name="pattern">路由模式</param>
    /// <returns>是否包含通配符</returns>
    public static bool IsWildcardRoute(string pattern) => pattern.Split('/').Any(segment => segment == "*");

    /// <summary>
    /// 将路由模式与实际路由进行通配符匹配
    /// <para>支持的通配符:</para>
    /// <para>- <c>*</c>:匹配任意路径(空路径在源生成器中已被规范化为 <c>*</c>)</para>
    /// <para>- <c>v1/*</c>:匹配 v1/ 后跟一个路径段</para>
    /// <para>- <c>v1/*/test</c>:匹配 v1/ 后跟任意一个段再跟 /test</para>
    /// </summary>
    /// <param name="pattern">包含通配符的路由模式</param>
    /// <param name="route">实际请求路由</param>
    /// <returns>是否匹配</returns>
    public static bool MatchWildcardRoute(string pattern, string route)
    {
        // 单独的 "*" 匹配所有路由
        if (pattern == "*")
            return true;

        var patternSegments = pattern.Split('/');
        var routeSegments = route.Split('/');

        return !patternSegments.Where((t, i) => t != "*" && t != routeSegments[i]).Any();
    }

    /// <summary>
    /// 计算路由模式的优先级,优先级规则如下
    /// </summary>
    /// <param name="pattern"></param>
    /// <returns></returns>
    public static int GetWildcardPatternPriority(string pattern)
    {
        var segments = pattern.Split('/', StringSplitOptions.RemoveEmptyEntries);
        var literalSegmentCount = 0;
        var wildcardSegmentCount = 0;
        foreach (var segment in segments)
        {
            if (segment == "*")
                wildcardSegmentCount++;
            else
                literalSegmentCount++;
        }
        return (literalSegmentCount * 1000) - (wildcardSegmentCount * 10) + pattern.Length;
    }
}