Skip to content

Commit cb57cb8

Browse files
authored
Add missing connection strings to EnvironmentVariablesConfigurationProvider (#116037)
1 parent 39e8c08 commit cb57cb8

2 files changed

Lines changed: 94 additions & 0 deletions

File tree

src/libraries/Microsoft.Extensions.Configuration.EnvironmentVariables/src/EnvironmentVariablesConfigurationProvider.cs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,20 @@ namespace Microsoft.Extensions.Configuration.EnvironmentVariables
1212
/// </summary>
1313
public class EnvironmentVariablesConfigurationProvider : ConfigurationProvider
1414
{
15+
// Connection string prefixes for various services. These prefixes are used to identify connection strings in environment variables.
16+
// az webapp config connection-string set: https://learn.microsoft.com/en-us/cli/azure/webapp/config/connection-string?view=azure-cli-latest#az-webapp-config-connection-string-set
17+
// Environment variables and app settings in Azure App Service: https://learn.microsoft.com/en-us/azure/app-service/reference-app-settings?tabs=kudu%2Cdotnet#variable-prefixes
1518
private const string MySqlServerPrefix = "MYSQLCONNSTR_";
1619
private const string SqlAzureServerPrefix = "SQLAZURECONNSTR_";
1720
private const string SqlServerPrefix = "SQLCONNSTR_";
1821
private const string CustomConnectionStringPrefix = "CUSTOMCONNSTR_";
22+
private const string PostgreSqlServerPrefix = "POSTGRESQLCONNSTR_";
23+
private const string ApiHubPrefix = "APIHUBCONNSTR_";
24+
private const string DocDbPrefix = "DOCDBCONNSTR_";
25+
private const string EventHubPrefix = "EVENTHUBCONNSTR_";
26+
private const string NotificationHubPrefix = "NOTIFICATIONHUBCONNSTR_";
27+
private const string RedisCachePrefix = "REDISCACHECONNSTR_";
28+
private const string ServiceBusPrefix = "SERVICEBUSCONNSTR_";
1929

2030
private readonly string _prefix;
2131
private readonly string _normalizedPrefix;
@@ -83,6 +93,34 @@ internal void Load(IDictionary envVariables)
8393
{
8494
HandleMatchedConnectionStringPrefix(data, SqlServerPrefix, "System.Data.SqlClient", key, value);
8595
}
96+
else if (key.StartsWith(PostgreSqlServerPrefix, StringComparison.OrdinalIgnoreCase))
97+
{
98+
HandleMatchedConnectionStringPrefix(data, PostgreSqlServerPrefix, "Npgsql", key, value);
99+
}
100+
else if (key.StartsWith(ApiHubPrefix, StringComparison.OrdinalIgnoreCase))
101+
{
102+
HandleMatchedConnectionStringPrefix(data, ApiHubPrefix, null, key, value);
103+
}
104+
else if (key.StartsWith(DocDbPrefix, StringComparison.OrdinalIgnoreCase))
105+
{
106+
HandleMatchedConnectionStringPrefix(data, DocDbPrefix, null, key, value);
107+
}
108+
else if (key.StartsWith(EventHubPrefix, StringComparison.OrdinalIgnoreCase))
109+
{
110+
HandleMatchedConnectionStringPrefix(data, EventHubPrefix, null, key, value);
111+
}
112+
else if (key.StartsWith(NotificationHubPrefix, StringComparison.OrdinalIgnoreCase))
113+
{
114+
HandleMatchedConnectionStringPrefix(data, NotificationHubPrefix, null, key, value);
115+
}
116+
else if (key.StartsWith(RedisCachePrefix, StringComparison.OrdinalIgnoreCase))
117+
{
118+
HandleMatchedConnectionStringPrefix(data, RedisCachePrefix, null, key, value);
119+
}
120+
else if (key.StartsWith(ServiceBusPrefix, StringComparison.OrdinalIgnoreCase))
121+
{
122+
HandleMatchedConnectionStringPrefix(data, ServiceBusPrefix, null, key, value);
123+
}
86124
else if (key.StartsWith(CustomConnectionStringPrefix, StringComparison.OrdinalIgnoreCase))
87125
{
88126
HandleMatchedConnectionStringPrefix(data, CustomConnectionStringPrefix, null, key, value);

src/libraries/Microsoft.Extensions.Configuration.EnvironmentVariables/tests/EnvironmentVariablesTest.cs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,5 +325,61 @@ private sealed class MyOptions
325325
public int Number { get; set; }
326326
public string Text { get; set; }
327327
}
328+
329+
[Fact]
330+
public void LoadsPostgreSqlConnectionStrings()
331+
{
332+
var dic = new Hashtable()
333+
{
334+
{"POSTGRESQLCONNSTR_db1", "Host=server1;Database=db1;Username=root;Password=password;"},
335+
};
336+
var envConfigSrc = new EnvironmentVariablesConfigurationProvider(null);
337+
338+
envConfigSrc.Load(dic);
339+
340+
Assert.Equal("Host=server1;Database=db1;Username=root;Password=password;", envConfigSrc.Get("ConnectionStrings:db1"));
341+
Assert.Equal("Npgsql", envConfigSrc.Get("ConnectionStrings:db1_ProviderName"));
342+
}
343+
344+
[Fact]
345+
public void LoadsAzureServiceConnectionStrings()
346+
{
347+
var dic = new Hashtable()
348+
{
349+
{"APIHUBCONNSTR_api1", "Endpoint=https://api1.azure.com;ApiKey=key1;"},
350+
{"DOCDBCONNSTR_docdb1", "AccountEndpoint=https://docdb1.documents.azure.com;AccountKey=key1;"},
351+
{"EVENTHUBCONNSTR_eventhub1", "Endpoint=sb://eventhub1.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=key1;"},
352+
{"NOTIFICATIONHUBCONNSTR_notification1", "Endpoint=sb://notification1.servicebus.windows.net/;SharedAccessKeyName=DefaultFullSharedAccessSignature;SharedAccessKey=key1;"},
353+
{"REDISCACHECONNSTR_redis1", "redis1.redis.cache.windows.net:6380,password=key1,ssl=True,abortConnect=False"},
354+
{"SERVICEBUSCONNSTR_servicebus1", "Endpoint=sb://servicebus1.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=key1;"},
355+
};
356+
var envConfigSrc = new EnvironmentVariablesConfigurationProvider(null);
357+
358+
envConfigSrc.Load(dic);
359+
360+
// API Hub
361+
Assert.Equal("Endpoint=https://api1.azure.com;ApiKey=key1;", envConfigSrc.Get("ConnectionStrings:api1"));
362+
Assert.Throws<InvalidOperationException>(() => envConfigSrc.Get("ConnectionStrings:api1_ProviderName"));
363+
364+
// DocDB (Cosmos DB)
365+
Assert.Equal("AccountEndpoint=https://docdb1.documents.azure.com;AccountKey=key1;", envConfigSrc.Get("ConnectionStrings:docdb1"));
366+
Assert.Throws<InvalidOperationException>(() => envConfigSrc.Get("ConnectionStrings:docdb1_ProviderName"));
367+
368+
// Event Hub
369+
Assert.Equal("Endpoint=sb://eventhub1.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=key1;", envConfigSrc.Get("ConnectionStrings:eventhub1"));
370+
Assert.Throws<InvalidOperationException>(() => envConfigSrc.Get("ConnectionStrings:eventhub1_ProviderName"));
371+
372+
// Notification Hub
373+
Assert.Equal("Endpoint=sb://notification1.servicebus.windows.net/;SharedAccessKeyName=DefaultFullSharedAccessSignature;SharedAccessKey=key1;", envConfigSrc.Get("ConnectionStrings:notification1"));
374+
Assert.Throws<InvalidOperationException>(() => envConfigSrc.Get("ConnectionStrings:notification1_ProviderName"));
375+
376+
// Redis Cache
377+
Assert.Equal("redis1.redis.cache.windows.net:6380,password=key1,ssl=True,abortConnect=False", envConfigSrc.Get("ConnectionStrings:redis1"));
378+
Assert.Throws<InvalidOperationException>(() => envConfigSrc.Get("ConnectionStrings:redis1_ProviderName"));
379+
380+
// Service Bus
381+
Assert.Equal("Endpoint=sb://servicebus1.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=key1;", envConfigSrc.Get("ConnectionStrings:servicebus1"));
382+
Assert.Throws<InvalidOperationException>(() => envConfigSrc.Get("ConnectionStrings:servicebus1_ProviderName"));
383+
}
328384
}
329385
}

0 commit comments

Comments
 (0)