diff --git a/src/FilterLists.Agent/Extensions/UriExtensions.cs b/src/FilterLists.Agent/Extensions/UriExtensions.cs index 0dd88cb42..d0eee94bd 100644 --- a/src/FilterLists.Agent/Extensions/UriExtensions.cs +++ b/src/FilterLists.Agent/Extensions/UriExtensions.cs @@ -9,5 +9,15 @@ public static string GetExtension(this Uri uri) { return Path.GetExtension(uri.AbsolutePath); } + + public static bool IsValidUrl(this Uri uri) + { + var uriString = uri.OriginalString; + if (!Uri.IsWellFormedUriString(uriString, UriKind.Absolute)) + return false; + if (!Uri.TryCreate(uriString, UriKind.Absolute, out var tmp)) + return false; + return tmp.Scheme == Uri.UriSchemeHttp || tmp.Scheme == Uri.UriSchemeHttps; + } } } \ No newline at end of file diff --git a/src/FilterLists.Agent/Features/Urls/ValidateUrls.cs b/src/FilterLists.Agent/Features/Urls/ValidateUrls.cs index f40913985..73358b024 100644 --- a/src/FilterLists.Agent/Features/Urls/ValidateUrls.cs +++ b/src/FilterLists.Agent/Features/Urls/ValidateUrls.cs @@ -5,6 +5,7 @@ using System.Threading; using System.Threading.Tasks; using System.Threading.Tasks.Dataflow; +using FilterLists.Agent.Extensions; using FilterLists.Agent.Features.Urls.Models.ValidationResults; using FilterLists.Agent.Infrastructure.Clients; using MediatR; @@ -60,6 +61,13 @@ private TransformBlock BuildValidator(CancellationToke async u => { var result = new UrlValidationResult(u); + if (!u.IsValidUrl()) + { + result.SetBroken(); + _logger.LogError($"{u.AbsoluteUri}) is not a valid URL."); + return result; + } + try { var response = await _httpClient.GetAsync(u, cancellationToken);