From 5217f8c04e6f075eb5ed468401988ecf68b1d0fc Mon Sep 17 00:00:00 2001 From: Bart Koelman <104792814+bart-vmware@users.noreply.github.com> Date: Fri, 15 May 2026 17:36:18 +0200 Subject: [PATCH] Ignore case when comparing Connector configuration keys --- .../Connectors/ConnectionStringPostProcessor.cs | 17 +++++++++++------ .../src/Connectors/ConnectorOptionsBinder.cs | 6 +++--- .../PostgreSql/PostgreSqlConnectorTest.cs | 2 +- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/Connectors/src/Connectors/ConnectionStringPostProcessor.cs b/src/Connectors/src/Connectors/ConnectionStringPostProcessor.cs index 964d867fa1..09a0e4eb08 100644 --- a/src/Connectors/src/Connectors/ConnectionStringPostProcessor.cs +++ b/src/Connectors/src/Connectors/ConnectionStringPostProcessor.cs @@ -15,7 +15,7 @@ namespace Steeltoe.Connectors; internal abstract class ConnectionStringPostProcessor : IConfigurationPostProcessor { private const string ConnectionStringName = "ConnectionString"; - public const string DefaultBindingName = "Default"; + private const string DefaultBindingName = "Default"; private static readonly string ClientBindingsConfigurationKey = ConfigurationPath.Combine("Steeltoe", "Client"); public static readonly string ServiceBindingsConfigurationKey = ConfigurationPath.Combine("steeltoe", "service-bindings"); @@ -37,7 +37,7 @@ public void PostProcessConfiguration(PostProcessorConfigurationProvider provider { bindingsByName.TryGetValue(DefaultBindingName, out BindingInfo? defaultBinding); - string? alternateBindingName = bindingsByName.Keys.SingleOrDefault(bindingName => bindingName != DefaultBindingName); + string? alternateBindingName = bindingsByName.Keys.SingleOrDefault(bindingName => !IsDefaultBindingName(bindingName)); BindingInfo? alternateBinding = alternateBindingName == null ? null : bindingsByName[alternateBindingName]; var bindingInfo = new BindingInfo @@ -55,20 +55,25 @@ public void PostProcessConfiguration(PostProcessorConfigurationProvider provider } else { - foreach ((string bindingName, BindingInfo bindingInfo) in bindingsByName.Where(binding => binding.Key != DefaultBindingName)) + foreach ((string bindingName, BindingInfo bindingInfo) in bindingsByName.Where(binding => !IsDefaultBindingName(binding.Key))) { SetConnectionString(configurationData, bindingName, bindingInfo); } } } + public static bool IsDefaultBindingName(string bindingName) + { + return string.Equals(bindingName, DefaultBindingName, StringComparison.OrdinalIgnoreCase); + } + private static bool ShouldSetDefault(Dictionary bindingsByName) { if (bindingsByName.Count == 1) { (string bindingName, BindingInfo binding) = bindingsByName.Single(); - if (bindingName == DefaultBindingName && binding.IsClientOnly) + if (IsDefaultBindingName(bindingName) && binding.IsClientOnly) { return true; } @@ -78,7 +83,7 @@ private static bool ShouldSetDefault(Dictionary bindingsByN if (bindingsByName.Count == 2 && bindingsByName.TryGetValue(DefaultBindingName, out BindingInfo? defaultBinding) && defaultBinding.IsClientOnly) { - BindingInfo alternateBinding = bindingsByName.Single(binding => binding.Key != DefaultBindingName).Value; + BindingInfo alternateBinding = bindingsByName.Single(binding => !IsDefaultBindingName(binding.Key)).Value; if (alternateBinding.IsServerOnly) { @@ -91,7 +96,7 @@ private static bool ShouldSetDefault(Dictionary bindingsByN private Dictionary GetBindingsByName(IConfiguration configuration) { - Dictionary bindingsByName = []; + var bindingsByName = new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (IConfigurationSection clientBinding in GetBindingSections(configuration, ClientBindingsConfigurationKey)) { diff --git a/src/Connectors/src/Connectors/ConnectorOptionsBinder.cs b/src/Connectors/src/Connectors/ConnectorOptionsBinder.cs index a99d5a87c0..71c346611c 100644 --- a/src/Connectors/src/Connectors/ConnectorOptionsBinder.cs +++ b/src/Connectors/src/Connectors/ConnectorOptionsBinder.cs @@ -30,7 +30,7 @@ public static IReadOnlySet RegisterNamedOptions(IServiceCollec { string bindingName = childSection.Key; - if (bindingName == ConnectionStringPostProcessor.DefaultBindingName) + if (ConnectionStringPostProcessor.IsDefaultBindingName(bindingName)) { services.Configure(childSection); @@ -62,7 +62,7 @@ private static bool ContainsNamedServiceBindings(IConfigurationSection[] section return false; } - if (sections is [{ Key: ConnectionStringPostProcessor.DefaultBindingName }]) + if (sections is [{ } singleSection] && ConnectionStringPostProcessor.IsDefaultBindingName(singleSection.Key)) { return false; } @@ -81,6 +81,6 @@ private static void RegisterHealthContributor(IServiceCollection services, strin private static HashSet GetNamedOptions(IConfigurationSection[] childSections) { - return childSections.Select(section => section.Key == ConnectionStringPostProcessor.DefaultBindingName ? string.Empty : section.Key).ToHashSet(); + return childSections.Select(section => ConnectionStringPostProcessor.IsDefaultBindingName(section.Key) ? string.Empty : section.Key).ToHashSet(); } } diff --git a/src/Connectors/test/Connectors.Test/PostgreSql/PostgreSqlConnectorTest.cs b/src/Connectors/test/Connectors.Test/PostgreSql/PostgreSqlConnectorTest.cs index 8ab17a04ee..5106a36435 100644 --- a/src/Connectors/test/Connectors.Test/PostgreSql/PostgreSqlConnectorTest.cs +++ b/src/Connectors/test/Connectors.Test/PostgreSql/PostgreSqlConnectorTest.cs @@ -488,7 +488,7 @@ public async Task Registers_default_connection_string_when_single_server_binding { var appSettings = new Dictionary { - ["Steeltoe:Client:PostgreSql:Default:ConnectionString"] = "SERVER=localhost;DB=myDb;UID=myUser;PWD=myPass;Log Parameters=True" + ["Steeltoe:Client:PostgreSql:DEFAULT:ConnectionString"] = "SERVER=localhost;DB=myDb;UID=myUser;PWD=myPass;Log Parameters=True" }; WebApplicationBuilder builder = TestWebApplicationBuilderFactory.Create();