Skip to content

Commit 404b530

Browse files
Updated previous fix to be a little less cast-heavy. Also added basic tests. (#217)
1 parent 69103ab commit 404b530

5 files changed

Lines changed: 281 additions & 58 deletions

File tree

src/Base/KeyValueConfigBuilder.cs

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -204,37 +204,23 @@ protected string UpdateConfigSettingWithAppSettings(string configName)
204204
if (!_lazyInitializeStarted || String.IsNullOrWhiteSpace(configValue))
205205
return configValue;
206206

207-
// If we are processing appSettings in ProcessConfigurationSection(), then we can use that. Other config builders in
208-
// the chain before us have already finished, so this is a relatively consistent and logical state to draw from.
209-
if (CurrentSection is AppSettingsSection appSettings && CurrentSection.SectionInformation?.SectionName == "appSettings")
207+
configValue = Regex.Replace(configValue, _tokenPattern, (m) =>
210208
{
211-
configValue = Regex.Replace(configValue, _tokenPattern, (m) =>
212-
{
213-
string settingName = m.Groups[1].Value;
209+
string settingName = m.Groups[1].Value;
210+
211+
// If we are processing appSettings in ProcessConfigurationSection(), then we can use that. Other config builders in
212+
// the chain before us have already finished, so this is a relatively consistent and logical state to draw from.
213+
if (CurrentSection is AppSettingsSection appSettings && CurrentSection.SectionInformation?.SectionName == "appSettings")
214214
return (appSettings.Settings[settingName]?.Value ?? m.Groups[0].Value);
215-
});
216-
}
217215

218-
// Try to use CurrentConfiguration before falling back to ConfigurationManager. Otherwise OpenConfiguration()
219-
// scenarios won't work because we're looking in the wrong processes AppSettings.
220-
else if (CurrentSection?.CurrentConfiguration?.AppSettings is AppSettingsSection currentAppSettings)
221-
{
222-
configValue = Regex.Replace(configValue, _tokenPattern, (m) =>
223-
{
224-
string settingName = m.Groups[1].Value;
216+
// Try to use CurrentConfiguration before falling back to ConfigurationManager. Otherwise OpenConfiguration()
217+
// scenarios won't work because we're looking in the wrong processes AppSettings.
218+
else if (CurrentSection?.CurrentConfiguration?.AppSettings is AppSettingsSection currentAppSettings)
225219
return (currentAppSettings.Settings[settingName]?.Value ?? m.Groups[0].Value);
226-
});
227-
}
228220

229-
// All other config sections can just go through ConfigurationManager to get app settings though. :)
230-
else
231-
{
232-
configValue = Regex.Replace(configValue, _tokenPattern, (m) =>
233-
{
234-
string settingName = m.Groups[1].Value;
235-
return (ConfigurationManager.AppSettings[settingName] ?? m.Groups[0].Value);
236-
});
237-
}
221+
// All other config sections can just go through ConfigurationManager to get app settings though. :)
222+
return (ConfigurationManager.AppSettings[settingName] ?? m.Groups[0].Value);
223+
});
238224

239225
_config[configName] = configValue;
240226
return configValue;

test/Microsoft.Configuration.ConfigurationBuilders.Test/ConnectionStringsSectionHandler2Tests.cs

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -12,39 +12,38 @@ namespace Test
1212
public class ConnectionStringsSectionHandler2Tests : IDisposable
1313
{
1414
private static readonly string cssh2ConfigTemplate = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
15-
<configuration>
16-
17-
<configSections>
18-
<section name=""connectionStrings"" type=""System.Configuration.ConnectionStringsSection, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"" restartOnExternalChanges=""false"" requirePermission=""false""/>
19-
<section name=""configBuilders"" type=""System.Configuration.ConfigurationBuildersSection, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"" restartOnExternalChanges=""false"" requirePermission=""false"" />
20-
<section name=""Microsoft.Configuration.ConfigurationBuilders.SectionHandlers"" type=""Microsoft.Configuration.ConfigurationBuilders.SectionHandlersSection, Microsoft.Configuration.ConfigurationBuilders.Base"" restartOnExternalChanges=""false"" requirePermission=""false"" />
21-
</configSections>
22-
23-
<Microsoft.Configuration.ConfigurationBuilders.SectionHandlers>
24-
<handlers>
25-
<remove name=""DefaultConnectionStringsHandler"" />
26-
<add name=""NewConnectionStringsHandler"" type=""Microsoft.Configuration.ConfigurationBuilders.ConnectionStringsSectionHandler2, Microsoft.Configuration.ConfigurationBuilders.Base"" />
27-
</handlers>
28-
</Microsoft.Configuration.ConfigurationBuilders.SectionHandlers>
29-
30-
<configBuilders>
31-
<builders>
32-
###DEFINED_BUILDERS###
33-
</builders>
34-
</configBuilders>
35-
36-
<connectionStrings configBuilders=""###APPLIED_BUILDERS###"">
37-
<add name=""connStr0"" connectionString=""pre-existing 0 connStr"" providerName=""should not be touched"" />
38-
<add name=""connStr2"" connectionString=""pre-existing 2 connStr"" />
39-
<add name=""connStr3"" connectionString=""pre-existing 3 connStr"" providerName=""pre-defined 3 pName"" />
40-
<add name=""${aNameFromJson}"" connectionString=""${connStr2:connectionString}"" providerName=""${connStr3:connectionString}"" />
41-
<add name=""aNameFromJson"" connectionString=""${token_value}"" providerName=""leave me alone"" />
42-
<add name=""weird"" connectionString=""${aNameFromJson}"" />
43-
</connectionStrings>
44-
45-
</configuration>";
15+
<configuration>
16+
17+
<configSections>
18+
<section name=""connectionStrings"" type=""System.Configuration.ConnectionStringsSection, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"" restartOnExternalChanges=""false"" requirePermission=""false""/>
19+
<section name=""configBuilders"" type=""System.Configuration.ConfigurationBuildersSection, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"" restartOnExternalChanges=""false"" requirePermission=""false"" />
20+
<section name=""Microsoft.Configuration.ConfigurationBuilders.SectionHandlers"" type=""Microsoft.Configuration.ConfigurationBuilders.SectionHandlersSection, Microsoft.Configuration.ConfigurationBuilders.Base"" restartOnExternalChanges=""false"" requirePermission=""false"" />
21+
</configSections>
22+
23+
<Microsoft.Configuration.ConfigurationBuilders.SectionHandlers>
24+
<handlers>
25+
<remove name=""DefaultConnectionStringsHandler"" />
26+
<add name=""NewConnectionStringsHandler"" type=""Microsoft.Configuration.ConfigurationBuilders.ConnectionStringsSectionHandler2, Microsoft.Configuration.ConfigurationBuilders.Base"" />
27+
</handlers>
28+
</Microsoft.Configuration.ConfigurationBuilders.SectionHandlers>
29+
30+
<configBuilders>
31+
<builders>
32+
###DEFINED_BUILDERS###
33+
</builders>
34+
</configBuilders>
35+
36+
<connectionStrings configBuilders=""###APPLIED_BUILDERS###"">
37+
<add name=""connStr0"" connectionString=""pre-existing 0 connStr"" providerName=""should not be touched"" />
38+
<add name=""connStr2"" connectionString=""pre-existing 2 connStr"" />
39+
<add name=""connStr3"" connectionString=""pre-existing 3 connStr"" providerName=""pre-defined 3 pName"" />
40+
<add name=""${aNameFromJson}"" connectionString=""${connStr2:connectionString}"" providerName=""${connStr3:connectionString}"" />
41+
<add name=""aNameFromJson"" connectionString=""${token_value}"" providerName=""leave me alone"" />
42+
<add name=""weird"" connectionString=""${aNameFromJson}"" />
43+
</connectionStrings>
44+
45+
</configuration>";
4646
private readonly string jsonTestFileName = Path.Combine(Environment.CurrentDirectory, "testConfigFiles", "simpleJsonConnStrTest.json");
47-
private List<string> tempFilesToCleanup = new List<string>();
4847

4948
[Fact]
5049
public void CSSH2_Strict()
@@ -283,6 +282,7 @@ public void CSSH2_Strict_TokenSectional()
283282

284283

285284

285+
private List<string> tempFilesToCleanup = new List<string>();
286286
private Configuration LoadConfigFromString(string configString)
287287
{
288288
string cfg = configString;

0 commit comments

Comments
 (0)