DomainMatch->DomainPattern
This commit is contained in:
parent
c494510433
commit
1900b77ba9
@ -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)
|
||||||
{
|
{
|
||||||
@ -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];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user