From 4f4b679e6197aacccea1da4cc61f3b49ef9a04fb Mon Sep 17 00:00:00 2001 From: Zhiyuan Liang Date: Thu, 18 Jul 2024 17:00:50 +0800 Subject: [PATCH] add enableStrictJsonParsing option --- .../AzureAppConfigurationOptions.cs | 9 ++++++++ .../JsonKeyValueAdapter.cs | 10 ++++++++- .../JsonContentTypeTests.cs | 22 +++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationOptions.cs b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationOptions.cs index d79838da..37b23239 100644 --- a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationOptions.cs +++ b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationOptions.cs @@ -444,6 +444,15 @@ public AzureAppConfigurationOptions ConfigureStartupOptions(Action + /// Configure the provider behavior when parsing invalid JSON values. When strict JSON parsing is enabled, the provider will throw , if a key-value with JSON content type has invalid JSON value. + /// + public AzureAppConfigurationOptions EnableStrictJsonParsing() + { + JsonKeyValueAdapter.ThrowOnInvalidJson = true; + return this; + } + private static ConfigurationClientOptions GetDefaultClientOptions() { var clientOptions = new ConfigurationClientOptions(ConfigurationClientOptions.ServiceVersion.V2023_10_01); diff --git a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/JsonKeyValueAdapter.cs b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/JsonKeyValueAdapter.cs index 2c11d423..7998ce62 100644 --- a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/JsonKeyValueAdapter.cs +++ b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/JsonKeyValueAdapter.cs @@ -16,6 +16,8 @@ namespace Microsoft.Extensions.Configuration.AzureAppConfiguration { internal class JsonKeyValueAdapter : IKeyValueAdapter { + public static bool ThrowOnInvalidJson { get; set; } = false; + private static readonly IEnumerable ExcludedJsonContentTypes = new[] { FeatureManagementConstants.ContentType, @@ -42,7 +44,13 @@ public Task>> ProcessKeyValue(Configura } catch (JsonException) { - // If the value is not a valid JSON, treat it like regular string value + if (ThrowOnInvalidJson) + { + throw new FormatException($"Invalid JSON value for key '{setting.Key}' with content type '{setting.ContentType}'. Please ensure the value is properly formatted JSON."); + } + + logger.LogWarning($"Invalid JSON value for key '{setting.Key}' with content type '{setting.ContentType}'. Treated as a string value."); + return Task.FromResult>>(new[] { new KeyValuePair(setting.Key, setting.Value) }); } diff --git a/tests/Tests.AzureAppConfiguration/JsonContentTypeTests.cs b/tests/Tests.AzureAppConfiguration/JsonContentTypeTests.cs index 91cb03a8..040f537b 100644 --- a/tests/Tests.AzureAppConfiguration/JsonContentTypeTests.cs +++ b/tests/Tests.AzureAppConfiguration/JsonContentTypeTests.cs @@ -124,6 +124,28 @@ public void JsonContentTypeTests_LoadSettingsWithInvalidJsonContentTypeAsString( Assert.Equal("{}", config["TestKey7"]); } + [Fact] + public void JsonContentTypeTests_EnableEnableStrictJsonParsing() + { + List _kvCollection = new List + { + ConfigurationModelFactory.ConfigurationSetting( + key: "TestKey1", + value: "True", + contentType: "application/json") + }; + var mockClientManager = GetMockConfigurationClientManager(_kvCollection); + + var builder = new ConfigurationBuilder() + .AddAzureAppConfiguration(options => + { + options.ClientManager = mockClientManager; + options.EnableStrictJsonParsing(); + }); + + var ex = Assert.Throws(() => builder.Build()); + } + [Fact] public void JsonContentTypeTests_OverwriteValuesForDuplicateKeysAfterFlatteningJson() {