From 0ee5b9d93edd3019d786f24c5b5a55a53efa278d Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Fri, 16 Oct 2026 10:59:57 -0400 Subject: [PATCH] refactor(data): share server URL validation The drawing library client needs the same base-address rule as the nest repository. Extract it into one internal helper so both clients accept and reject exactly the same addresses. Behavior is unchanged. Co-Authored-By: Claude Opus 5.5 --- OpenNest.Data/RemoteNestRepository.cs | 9 +-------- OpenNest.Data/ServerUrl.cs | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 8 deletions(-) create mode 100644 OpenNest.Data/ServerUrl.cs diff --git a/OpenNest.Data/RemoteNestRepository.cs b/OpenNest.Data/RemoteNestRepository.cs index 16c676b0..89062520 100644 --- a/OpenNest.Data/RemoteNestRepository.cs +++ b/OpenNest.Data/RemoteNestRepository.cs @@ -38,14 +38,7 @@ public sealed class RemoteNestRepository : INestRepository, IDisposable { _httpClient = httpClient; _ownsClient = false; - var url = (baseUrl ?? "").Trim().TrimEnd('/'); - if (!Uri.TryCreate(url, UriKind.Absolute, out var baseUri) - || (baseUri.Scheme != Uri.UriSchemeHttp && baseUri.Scheme != Uri.UriSchemeHttps)) - { - throw new ArgumentException($"Invalid nest server URL: '{baseUrl}'", nameof(baseUrl)); - } - // Keep the trailing slash so relative combines replace no path segment. - _baseUri = new Uri(baseUri.AbsoluteUri.TrimEnd('/') + "/"); + _baseUri = ServerUrl.ParseBase(baseUrl, nameof(baseUrl)); } private Uri Url(string relative) => new(_baseUri, relative); diff --git a/OpenNest.Data/ServerUrl.cs b/OpenNest.Data/ServerUrl.cs new file mode 100644 index 00000000..0b4d25a1 --- /dev/null +++ b/OpenNest.Data/ServerUrl.cs @@ -0,0 +1,21 @@ +namespace OpenNest.Data; + +/// Base-address validation shared by the nest server's HTTP clients. +internal static class ServerUrl +{ + /// + /// Returns the absolute http(s) base address with exactly one trailing slash, so + /// relative combines replace no path segment. Throws for any other address. + /// + public static Uri ParseBase(string? baseUrl, string paramName) + { + var url = (baseUrl ?? "").Trim().TrimEnd('/'); + if (!Uri.TryCreate(url, UriKind.Absolute, out var baseUri) + || (baseUri.Scheme != Uri.UriSchemeHttp && baseUri.Scheme != Uri.UriSchemeHttps)) + { + throw new ArgumentException($"Invalid nest server URL: '{baseUrl}'", paramName); + } + + return new Uri(baseUri.AbsoluteUri.TrimEnd('/') + "/"); + } +}