增加域名排序

This commit is contained in:
xljiulang 2021-07-22 20:25:16 +08:00
parent 58ffa9a2e9
commit 6abc044e90
2 changed files with 100 additions and 8 deletions

View File

@ -1,11 +1,12 @@
using System.Text.RegularExpressions; using System;
using System.Text.RegularExpressions;
namespace FastGithub namespace FastGithub
{ {
/// <summary> /// <summary>
/// 域名匹配 /// 域名匹配
/// </summary> /// </summary>
public class DomainMatch public class DomainMatch : IComparable<DomainMatch>
{ {
private readonly Regex regex; private readonly Regex regex;
private readonly string domainPattern; private readonly string domainPattern;
@ -21,6 +22,82 @@ namespace FastGithub
this.regex = new Regex($"^{regexPattern}$", RegexOptions.IgnoreCase); this.regex = new Regex($"^{regexPattern}$", RegexOptions.IgnoreCase);
} }
/// <summary>
/// 与目标比较
/// </summary>
/// <param name="other"></param>
/// <returns></returns>
public int CompareTo(DomainMatch? other)
{
if (other is null)
{
return 1;
}
var segmentsX = this.domainPattern.Split('.');
var segmentsY = other.domainPattern.Split('.');
if (segmentsX.Length > segmentsY.Length)
{
return 1;
}
if (segmentsX.Length < segmentsY.Length)
{
return -1;
}
for (var i = 0; i < segmentsX.Length; i++)
{
var x = segmentsX[i];
var y = segmentsY[i];
var value = Compare(x, y);
if (value == 0)
{
continue;
}
return value;
}
return 0;
}
/// <summary>
/// 比较两个分段
/// </summary>
/// <param name="x">abc</param>
/// <param name="y">abc*</param>
/// <returns></returns>
private static int Compare(string x, string y)
{
if (x == y)
{
return 0;
}
var valueX = x.Replace("*", null);
var valueY = y.Replace("*", null);
var maskX = x.Length - valueX.Length;
var maskY = y.Length - valueY.Length;
if (maskX == 0 && maskY > 0)
{
return -1;
}
if (maskY == 0 && maskX > 0)
{
return 1;
}
var value = valueX.CompareTo(valueY);
if (value == 0)
{
value = x.CompareTo(y);
}
return value;
}
/// <summary> /// <summary>
/// 是否与指定域名匹配 /// 是否与指定域名匹配
/// </summary> /// </summary>

View File

@ -30,7 +30,7 @@ namespace FastGithub
/// <summary> /// <summary>
/// 获取域名配置 /// 获取域名配置
/// </summary> /// </summary>
public Dictionary<DomainMatch, DomainConfig> DomainConfigs { get; private set; } public SortedDictionary<DomainMatch, DomainConfig> DomainConfigs { get; private set; }
/// <summary> /// <summary>
/// FastGithub配置 /// FastGithub配置
@ -42,12 +42,12 @@ namespace FastGithub
ILogger<FastGithubConfig> logger) ILogger<FastGithubConfig> logger)
{ {
this.logger = logger; this.logger = logger;
var opt = options.CurrentValue; var opt = options.CurrentValue;
this.domainConfigCache = new ConcurrentDictionary<string, DomainConfig?>();
this.PureDns = opt.PureDns.ToIPEndPoint(); this.PureDns = opt.PureDns.ToIPEndPoint();
this.FastDns = opt.FastDns.ToIPEndPoint(); this.FastDns = opt.FastDns.ToIPEndPoint();
this.DomainConfigs = opt.DomainConfigs.ToDictionary(kv => new DomainMatch(kv.Key), kv => kv.Value); this.DomainConfigs = ConvertDomainConfigs(opt.DomainConfigs);
this.domainConfigCache = new ConcurrentDictionary<string, DomainConfig?>();
options.OnChange(opt => this.Update(opt)); options.OnChange(opt => this.Update(opt));
} }
@ -60,10 +60,10 @@ namespace FastGithub
{ {
try try
{ {
this.domainConfigCache = new ConcurrentDictionary<string, DomainConfig?>();
this.PureDns = options.PureDns.ToIPEndPoint(); this.PureDns = options.PureDns.ToIPEndPoint();
this.FastDns = options.FastDns.ToIPEndPoint(); this.FastDns = options.FastDns.ToIPEndPoint();
this.DomainConfigs = options.DomainConfigs.ToDictionary(kv => new DomainMatch(kv.Key), kv => kv.Value); this.DomainConfigs = ConvertDomainConfigs(options.DomainConfigs);
this.domainConfigCache = new ConcurrentDictionary<string, DomainConfig?>();
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -71,6 +71,21 @@ namespace FastGithub
} }
} }
/// <summary>
/// 配置转换
/// </summary>
/// <param name="domainConfigs"></param>
/// <returns></returns>
private static SortedDictionary<DomainMatch, DomainConfig> ConvertDomainConfigs(Dictionary<string, DomainConfig> domainConfigs)
{
var result = new SortedDictionary<DomainMatch, DomainConfig>();
foreach (var kv in domainConfigs)
{
result.Add(new DomainMatch(kv.Key), kv.Value);
}
return result;
}
/// <summary> /// <summary>
/// 是否匹配指定的域名 /// 是否匹配指定的域名
/// </summary> /// </summary>