From 2c02ea913df91bb7a52c706017ee3aa0251fbd37 Mon Sep 17 00:00:00 2001 From: Gregorius Soedharmo Date: Fri, 14 Feb 2020 02:03:56 +0700 Subject: [PATCH 1/4] Fix quoted keys are written as unqoted during serialization. --- src/Hocon/Impl/HoconObject.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Hocon/Impl/HoconObject.cs b/src/Hocon/Impl/HoconObject.cs index 5351389f..6ca3975b 100644 --- a/src/Hocon/Impl/HoconObject.cs +++ b/src/Hocon/Impl/HoconObject.cs @@ -174,7 +174,7 @@ public string ToString(int indent, int indentSize) var i = new string(' ', indent * indentSize); var sb = new StringBuilder(); foreach (var field in this) - sb.Append($"{i}{field.Key} : {field.Value.ToString(indent + 1, indentSize)},{Environment.NewLine}"); + sb.Append($"{i}{(field.Key.NeedQuotes() ? field.Key.AddQuotes() : field.Key)} : {field.Value.ToString(indent + 1, indentSize)},{Environment.NewLine}"); return sb.Length > 2 ? sb.ToString(0, sb.Length - Environment.NewLine.Length - 1) : sb.ToString(); } From a0f116c388a09f155c5893ac7ae185cd462c1957 Mon Sep 17 00:00:00 2001 From: Gregorius Soedharmo Date: Fri, 14 Feb 2020 02:04:56 +0700 Subject: [PATCH 2/4] Fix ConfigurationFactory.Default() should return Config.Empty when it fails to load anything. --- src/Hocon.Configuration/ConfigurationFactory.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Hocon.Configuration/ConfigurationFactory.cs b/src/Hocon.Configuration/ConfigurationFactory.cs index b4a55eb8..780720a6 100644 --- a/src/Hocon.Configuration/ConfigurationFactory.cs +++ b/src/Hocon.Configuration/ConfigurationFactory.cs @@ -110,7 +110,12 @@ public static Config Default() try { var def = Load("hocon"); // new default - if (def == null || def.IsEmpty) return Load("akka"); // old Akka.NET-specific default + if (!def.IsNullOrEmpty()) + return def; + + def = Load("akka"); // old Akka.NET-specific default + if (!def.IsNullOrEmpty()) + return def; } catch { From ddbd40b687f59ad49283a81de0d358765ed12f2d Mon Sep 17 00:00:00 2001 From: Gregorius Soedharmo Date: Thu, 20 Feb 2020 08:04:26 +0700 Subject: [PATCH 3/4] Add reproduction spec --- src/Hocon.Tests/PathTests.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Hocon.Tests/PathTests.cs b/src/Hocon.Tests/PathTests.cs index 56ac9568..1957e53a 100644 --- a/src/Hocon.Tests/PathTests.cs +++ b/src/Hocon.Tests/PathTests.cs @@ -108,5 +108,13 @@ public void PathToStringQuoteKeysContainingDot() Assert.NotEqual(path1.Value, path2.Value); Assert.Equal("i am.\"kong.fu\".panda", path1.Value); } + + [Fact] + public void QuotedKeyShouldHandleInvalidCharacters() + { + var hoconString = @"this.""should[]"".work = true"; + var config = HoconParser.Parse(hoconString); + Assert.True(config.GetBoolean("this.\"should[]\".work")); + } } } \ No newline at end of file From 702a3b2e00d49d2145b3411e3bc9bce5078a87a5 Mon Sep 17 00:00:00 2001 From: Gregorius Soedharmo Date: Thu, 20 Feb 2020 08:10:25 +0700 Subject: [PATCH 4/4] Add reproduction spec on serialize. --- src/Hocon.Configuration.Test/SerializationSpecs.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/Hocon.Configuration.Test/SerializationSpecs.cs b/src/Hocon.Configuration.Test/SerializationSpecs.cs index b76f342c..404f9492 100644 --- a/src/Hocon.Configuration.Test/SerializationSpecs.cs +++ b/src/Hocon.Configuration.Test/SerializationSpecs.cs @@ -62,5 +62,19 @@ public void ShouldResolveEmptyToEmpty() HoconConfigurationFactory.ParseString("{}").IsEmpty.Should().BeTrue(); Config.Empty.IsEmpty.Should().BeTrue(); } + + [Fact] + public void QuotedKeyWithInvalidCharactersShouldSerializeProperly() + { + var hoconString = @"this.""should[]"".work = true"; + var config = HoconConfigurationFactory.ParseString(hoconString); + var serialized = JsonConvert.SerializeObject(config); + var deserialized = JsonConvert.DeserializeObject(serialized); + + Assert.True(config.GetBoolean("this.\"should[]\".work")); + Assert.True(deserialized.GetBoolean("this.\"should[]\".work")); + Assert.Equal(config, deserialized); + } + } }