2
0

FastGithubConfig.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using Microsoft.Extensions.Logging;
  2. using Microsoft.Extensions.Options;
  3. using System;
  4. using System.Collections.Concurrent;
  5. using System.Collections.Generic;
  6. using System.Diagnostics.CodeAnalysis;
  7. using System.Linq;
  8. namespace FastGithub.Configuration
  9. {
  10. /// <summary>
  11. /// FastGithub配置
  12. /// </summary>
  13. public class FastGithubConfig
  14. {
  15. private readonly ILogger<FastGithubConfig> logger;
  16. private SortedDictionary<DomainPattern, DomainConfig> domainConfigs;
  17. private ConcurrentDictionary<string, DomainConfig?> domainConfigCache;
  18. /// <summary>
  19. /// FastGithub配置
  20. /// </summary>
  21. /// <param name="options"></param>
  22. /// <param name="logger"></param>
  23. public FastGithubConfig(
  24. IOptionsMonitor<FastGithubOptions> options,
  25. ILogger<FastGithubConfig> logger)
  26. {
  27. this.logger = logger;
  28. var opt = options.CurrentValue;
  29. this.domainConfigs = ConvertDomainConfigs(opt.DomainConfigs);
  30. this.domainConfigCache = new ConcurrentDictionary<string, DomainConfig?>();
  31. options.OnChange(opt => this.Update(opt));
  32. }
  33. /// <summary>
  34. /// 更新配置
  35. /// </summary>
  36. /// <param name="options"></param>
  37. private void Update(FastGithubOptions options)
  38. {
  39. try
  40. {
  41. this.domainConfigs = ConvertDomainConfigs(options.DomainConfigs);
  42. this.domainConfigCache = new ConcurrentDictionary<string, DomainConfig?>();
  43. }
  44. catch (Exception ex)
  45. {
  46. this.logger.LogError(ex.Message);
  47. }
  48. }
  49. /// <summary>
  50. /// 配置转换
  51. /// </summary>
  52. /// <param name="domainConfigs"></param>
  53. /// <returns></returns>
  54. private static SortedDictionary<DomainPattern, DomainConfig> ConvertDomainConfigs(Dictionary<string, DomainConfig> domainConfigs)
  55. {
  56. var result = new SortedDictionary<DomainPattern, DomainConfig>();
  57. foreach (var kv in domainConfigs)
  58. {
  59. result.Add(new DomainPattern(kv.Key), kv.Value);
  60. }
  61. return result;
  62. }
  63. /// <summary>
  64. /// 是否匹配指定的域名
  65. /// </summary>
  66. /// <param name="domain"></param>
  67. /// <returns></returns>
  68. public bool IsMatch(string domain)
  69. {
  70. return this.TryGetDomainConfig(domain, out _);
  71. }
  72. /// <summary>
  73. /// 尝试获取域名配置
  74. /// </summary>
  75. /// <param name="domain"></param>
  76. /// <param name="value"></param>
  77. /// <returns></returns>
  78. public bool TryGetDomainConfig(string domain, [MaybeNullWhen(false)] out DomainConfig value)
  79. {
  80. value = this.domainConfigCache.GetOrAdd(domain, GetDomainConfig);
  81. return value != null;
  82. DomainConfig? GetDomainConfig(string domain)
  83. {
  84. var key = this.domainConfigs.Keys.FirstOrDefault(item => item.IsMatch(domain));
  85. return key == null ? null : this.domainConfigs[key];
  86. }
  87. }
  88. /// <summary>
  89. /// 获取所有域名表达式
  90. /// </summary>
  91. /// <returns></returns>
  92. public string[] GetDomainPatterns()
  93. {
  94. return this.domainConfigs.Keys.Select(item => item.ToString()).ToArray();
  95. }
  96. }
  97. }