Skip to content

Commit 9e5f676

Browse files
committed
Add config-based TldRuleDivisionFilter
1 parent 2d4b1f1 commit 9e5f676

File tree

8 files changed

+83
-39
lines changed

8 files changed

+83
-39
lines changed

src/Nager.PublicSuffix.TestConsole/Program.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ async Task DemoCachedHttpRuleProviderAsync()
2222
IConfiguration configuration = new ConfigurationBuilder()
2323
.AddInMemoryCollection(new List<KeyValuePair<string, string?>>
2424
{
25-
new("Nager:PublicSuffix:DataUrl", "https://publicsuffix.org/list/public_suffix_list.dat")
25+
new("Nager:PublicSuffix:DataUrl", "https://publicsuffix.org/list/public_suffix_list.dat"),
26+
//new("Nager:PublicSuffix:TldRuleDivisionFilter", "ICANNOnly"),
2627
})
2728
.Build();
2829

src/Nager.PublicSuffix/DomainInfo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public class DomainInfo
2828

2929
/// <summary>
3030
/// The Registrable Domain<para />
31-
/// e.g. microsoft.com, amazon.co.uk
31+
/// e.g. microsoft.com, amazon.co.uk, google.com
3232
/// </summary>
3333
public string? RegistrableDomain { get; private set; }
3434

src/Nager.PublicSuffix/Nager.PublicSuffix.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
<TargetFrameworks>netstandard2.0;netstandard2.1;net8.0</TargetFrameworks>
2828

29-
<Version>3.6.0</Version>
29+
<Version>3.7.0</Version>
3030
</PropertyGroup>
3131

3232
<ItemGroup>

src/Nager.PublicSuffix/RuleProviders/BaseRuleProvider.cs

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
using Nager.PublicSuffix.Extensions;
1+
using Microsoft.Extensions.Configuration;
2+
using Nager.PublicSuffix.Extensions;
23
using Nager.PublicSuffix.Models;
4+
using System;
35
using System.Collections.Generic;
46
using System.Threading;
57
using System.Threading.Tasks;
@@ -38,5 +40,62 @@ protected void CreateDomainDataStructure(IEnumerable<TldRule> rules)
3840
{
3941
return this._domainDataStructure;
4042
}
43+
44+
/// <summary>
45+
/// Determines the data source URL for the public suffix list.
46+
/// </summary>
47+
/// <param name="configuration">Optional configuration source to override the default URL.</param>
48+
/// <returns>
49+
/// Returns the configured URL if <c>Nager:PublicSuffix:DataUrl</c> is set;
50+
/// otherwise returns the default URL "https://publicsuffix.org/list/public_suffix_list.dat".
51+
/// </returns>
52+
protected string GetDataUrl(
53+
IConfiguration? configuration)
54+
{
55+
var url = "https://publicsuffix.org/list/public_suffix_list.dat";
56+
57+
if (configuration is null)
58+
{
59+
return url;
60+
}
61+
62+
var tempUrl = configuration["Nager:PublicSuffix:DataUrl"];
63+
if (string.IsNullOrEmpty(tempUrl))
64+
{
65+
return url;
66+
}
67+
68+
return tempUrl!;
69+
}
70+
71+
/// <summary>
72+
/// Determines the applicable TLD rule division filter from the configuration.
73+
/// </summary>
74+
/// <param name="configuration">Optional configuration source to override the default filter.</param>
75+
/// <param name="tldRuleDivisionFilter">The default filter used when no configuration value is provided.</param>
76+
/// <returns>
77+
/// Returns the configured filter if <c>Nager:PublicSuffix:TldRuleDivisionFilter</c> is set and valid;
78+
/// otherwise returns the provided default filter or <see cref="TldRuleDivisionFilter.All"/> if parsing fails.
79+
/// </returns>
80+
protected TldRuleDivisionFilter GetTldRuleDivisionFilter(
81+
IConfiguration? configuration,
82+
TldRuleDivisionFilter tldRuleDivisionFilter)
83+
{
84+
if (configuration is null)
85+
{
86+
return tldRuleDivisionFilter;
87+
}
88+
89+
var tempTldRuleDivisionFilter = configuration["Nager:PublicSuffix:TldRuleDivisionFilter"];
90+
if (!string.IsNullOrEmpty(tempTldRuleDivisionFilter))
91+
{
92+
if (!Enum.TryParse(tempTldRuleDivisionFilter, out tldRuleDivisionFilter))
93+
{
94+
return TldRuleDivisionFilter.All;
95+
}
96+
}
97+
98+
return tldRuleDivisionFilter;
99+
}
41100
}
42101
}

src/Nager.PublicSuffix/RuleProviders/CachedHttpRuleProvider.cs

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,8 @@ public CachedHttpRuleProvider(
5151
this._cacheProvider = cacheProvider;
5252
this._httpClient = httpClient;
5353

54-
var url = configuration["Nager:PublicSuffix:DataUrl"];
55-
if (string.IsNullOrEmpty(url))
56-
{
57-
url = "https://publicsuffix.org/list/public_suffix_list.dat";
58-
}
59-
60-
this._dataFileUrl = url ?? throw new InvalidOperationException("_dataFileUrl must contain a non-null value");
61-
this._tldRuleDivisionFilter = tldRuleDivisionFilter;
54+
this._dataFileUrl = base.GetDataUrl(configuration);
55+
this._tldRuleDivisionFilter = base.GetTldRuleDivisionFilter(configuration, tldRuleDivisionFilter);
6256
}
6357

6458
/// <summary>
@@ -81,19 +75,9 @@ public CachedHttpRuleProvider(
8175
this._cacheProvider = cacheProvider;
8276
this._httpClient = httpClient;
8377
this._logger = logger ?? new NullLogger<CachedHttpRuleProvider>();
84-
this._tldRuleDivisionFilter = tldRuleDivisionFilter;
85-
86-
var url = "https://publicsuffix.org/list/public_suffix_list.dat";
87-
if (configuration != default)
88-
{
89-
var tempUrl = configuration["Nager:PublicSuffix:DataUrl"];
90-
if (!string.IsNullOrEmpty(tempUrl))
91-
{
92-
url = tempUrl!;
93-
}
94-
}
9578

96-
this._dataFileUrl = url;
79+
this._dataFileUrl = base.GetDataUrl(configuration);
80+
this._tldRuleDivisionFilter = base.GetTldRuleDivisionFilter(configuration, tldRuleDivisionFilter);
9781
}
9882

9983
/// <inheritdoc/>

src/Nager.PublicSuffix/RuleProviders/IRuleProvider.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,18 @@
55
namespace Nager.PublicSuffix.RuleProviders
66
{
77
/// <summary>
8-
/// Interface RuleProvider
8+
/// Rule Provider Interface
99
/// </summary>
1010
public interface IRuleProvider
1111
{
1212
/// <summary>
13-
/// Loads the plain text data from a source and parse the public suffix rules
13+
/// Loads and parses the public suffix rules from the data source.
1414
/// </summary>
15-
/// <param name="ignoreCache">Do not use the data in the cache</param>
16-
/// <param name="cancellationToken"></param>
17-
/// <returns>Returns the TldRules</returns>
15+
/// <param name="ignoreCache">
16+
/// If set to <c>true</c>, bypasses the cached data — only applicable when the provider supports caching.
17+
/// </param>
18+
/// <param name="cancellationToken">Token to cancel the operation.</param>
19+
/// <returns><c>true</c> if the rules were successfully built; otherwise, <c>false</c>.</returns>
1820
Task<bool> BuildAsync(
1921
bool ignoreCache = false,
2022
CancellationToken cancellationToken = default);

src/Nager.PublicSuffix/RuleProviders/LocalFileRuleProvider.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Nager.PublicSuffix.Extensions;
1+
using Microsoft.Extensions.Configuration;
2+
using Nager.PublicSuffix.Extensions;
23
using Nager.PublicSuffix.Models;
34
using Nager.PublicSuffix.RuleParsers;
45
using System.IO;
@@ -20,12 +21,14 @@ public class LocalFileRuleProvider : BaseRuleProvider
2021
/// </summary>
2122
/// <param name="filePath"></param>
2223
/// <param name="tldRuleDivisionFilter"></param>
24+
/// <param name="configuration"></param>
2325
public LocalFileRuleProvider(
2426
string filePath,
25-
TldRuleDivisionFilter tldRuleDivisionFilter = TldRuleDivisionFilter.All)
27+
TldRuleDivisionFilter tldRuleDivisionFilter = TldRuleDivisionFilter.All,
28+
IConfiguration? configuration = null)
2629
{
2730
this._filePath = filePath;
28-
this._tldRuleDivisionFilter = tldRuleDivisionFilter;
31+
this._tldRuleDivisionFilter = base.GetTldRuleDivisionFilter(configuration, tldRuleDivisionFilter);
2932
}
3033

3134
/// <inheritdoc/>

src/Nager.PublicSuffix/RuleProviders/SimpleHttpRuleProvider.cs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,8 @@ public SimpleHttpRuleProvider(
4444
this._httpClient = httpClient ?? new HttpClient();
4545
this._tldRuleDivisionFilter = tldRuleDivisionFilter;
4646

47-
var url = configuration != null ? configuration["Nager:PublicSuffix:DataUrl"] : string.Empty;
48-
if (string.IsNullOrEmpty(url))
49-
{
50-
url = "https://publicsuffix.org/list/public_suffix_list.dat";
51-
}
52-
53-
this._dataFileUrl = url ?? throw new InvalidOperationException("_dataFileUrl must contain a non-null value");
47+
this._dataFileUrl = base.GetDataUrl(configuration);
48+
this._tldRuleDivisionFilter = base.GetTldRuleDivisionFilter(configuration, tldRuleDivisionFilter);
5449
}
5550

5651
/// <inheritdoc/>

0 commit comments

Comments
 (0)