DomainMatch->DomainPattern

This commit is contained in:
xljiulang 2021-07-22 21:26:40 +08:00
parent c494510433
commit 1900b77ba9
2 changed files with 19 additions and 26 deletions

View File

@ -4,19 +4,20 @@ using System.Text.RegularExpressions;
namespace FastGithub namespace FastGithub
{ {
/// <summary> /// <summary>
/// 域名匹配 /// 表示域名表达式
/// *表示除.之外任意0到多个字符 /// *表示除.之外任意0到多个字符
/// </summary> /// </summary>
public class DomainMatch : IComparable<DomainMatch> sealed class DomainPattern : IComparable<DomainPattern>
{ {
private readonly Regex regex; private readonly Regex regex;
private readonly string domainPattern; private readonly string domainPattern;
/// <summary> /// <summary>
/// 域名匹配 /// 域名表达式
/// *表示除.之外任意0到多个字符
/// </summary> /// </summary>
/// <param name="domainPattern">域名表达式</param> /// <param name="domainPattern">域名表达式</param>
public DomainMatch(string domainPattern) public DomainPattern(string domainPattern)
{ {
this.domainPattern = domainPattern; this.domainPattern = domainPattern;
var regexPattern = Regex.Escape(domainPattern).Replace(@"\*", @"[^\.]*"); var regexPattern = Regex.Escape(domainPattern).Replace(@"\*", @"[^\.]*");
@ -28,7 +29,7 @@ namespace FastGithub
/// </summary> /// </summary>
/// <param name="other"></param> /// <param name="other"></param>
/// <returns></returns> /// <returns></returns>
public int CompareTo(DomainMatch? other) public int CompareTo(DomainPattern? other)
{ {
if (other is null) if (other is null)
{ {

View File

@ -15,6 +15,7 @@ namespace FastGithub
public class FastGithubConfig public class FastGithubConfig
{ {
private readonly ILogger<FastGithubConfig> logger; private readonly ILogger<FastGithubConfig> logger;
private SortedDictionary<DomainPattern, DomainConfig> domainConfigs;
private ConcurrentDictionary<string, DomainConfig?> domainConfigCache; private ConcurrentDictionary<string, DomainConfig?> domainConfigCache;
/// <summary> /// <summary>
@ -27,10 +28,6 @@ namespace FastGithub
/// </summary> /// </summary>
public IPEndPoint FastDns { get; private set; } public IPEndPoint FastDns { get; private set; }
/// <summary>
/// 获取域名配置
/// </summary>
public SortedDictionary<DomainMatch, DomainConfig> DomainConfigs { get; private set; }
/// <summary> /// <summary>
/// FastGithub配置 /// FastGithub配置
@ -46,7 +43,7 @@ namespace FastGithub
this.PureDns = opt.PureDns.ToIPEndPoint(); this.PureDns = opt.PureDns.ToIPEndPoint();
this.FastDns = opt.FastDns.ToIPEndPoint(); this.FastDns = opt.FastDns.ToIPEndPoint();
this.DomainConfigs = ConvertDomainConfigs(opt.DomainConfigs); this.domainConfigs = ConvertDomainConfigs(opt.DomainConfigs);
this.domainConfigCache = new ConcurrentDictionary<string, DomainConfig?>(); this.domainConfigCache = new ConcurrentDictionary<string, DomainConfig?>();
options.OnChange(opt => this.Update(opt)); options.OnChange(opt => this.Update(opt));
@ -62,7 +59,7 @@ namespace FastGithub
{ {
this.PureDns = options.PureDns.ToIPEndPoint(); this.PureDns = options.PureDns.ToIPEndPoint();
this.FastDns = options.FastDns.ToIPEndPoint(); this.FastDns = options.FastDns.ToIPEndPoint();
this.DomainConfigs = ConvertDomainConfigs(options.DomainConfigs); this.domainConfigs = ConvertDomainConfigs(options.DomainConfigs);
this.domainConfigCache = new ConcurrentDictionary<string, DomainConfig?>(); this.domainConfigCache = new ConcurrentDictionary<string, DomainConfig?>();
} }
catch (Exception ex) catch (Exception ex)
@ -76,12 +73,12 @@ namespace FastGithub
/// </summary> /// </summary>
/// <param name="domainConfigs"></param> /// <param name="domainConfigs"></param>
/// <returns></returns> /// <returns></returns>
private static SortedDictionary<DomainMatch, DomainConfig> ConvertDomainConfigs(Dictionary<string, DomainConfig> domainConfigs) private static SortedDictionary<DomainPattern, DomainConfig> ConvertDomainConfigs(Dictionary<string, DomainConfig> domainConfigs)
{ {
var result = new SortedDictionary<DomainMatch, DomainConfig>(); var result = new SortedDictionary<DomainPattern, DomainConfig>();
foreach (var kv in domainConfigs) foreach (var kv in domainConfigs)
{ {
result.Add(new DomainMatch(kv.Key), kv.Value); result.Add(new DomainPattern(kv.Key), kv.Value);
} }
return result; return result;
} }
@ -93,7 +90,7 @@ namespace FastGithub
/// <returns></returns> /// <returns></returns>
public bool IsMatch(string domain) public bool IsMatch(string domain)
{ {
return this.DomainConfigs.Keys.Any(item => item.IsMatch(domain)); return this.domainConfigs.Keys.Any(item => item.IsMatch(domain));
} }
/// <summary> /// <summary>
@ -104,19 +101,14 @@ namespace FastGithub
/// <returns></returns> /// <returns></returns>
public bool TryGetDomainConfig(string domain, [MaybeNullWhen(false)] out DomainConfig value) public bool TryGetDomainConfig(string domain, [MaybeNullWhen(false)] out DomainConfig value)
{ {
value = this.domainConfigCache.GetOrAdd(domain, this.GetDomainConfig); value = this.domainConfigCache.GetOrAdd(domain, GetDomainConfig);
return value != null; return value != null;
}
/// <summary> DomainConfig? GetDomainConfig(string domain)
/// 获取域名配置 {
/// </summary> var key = this.domainConfigs.Keys.FirstOrDefault(item => item.IsMatch(domain));
/// <param name="domain"></param> return key == null ? null : this.domainConfigs[key];
/// <returns></returns> }
private DomainConfig? GetDomainConfig(string domain)
{
var key = this.DomainConfigs.Keys.FirstOrDefault(item => item.IsMatch(domain));
return key == null ? null : this.DomainConfigs[key];
} }
} }
} }