From 09eba825d967b2a28241e436a2f88164f0d0b7e8 Mon Sep 17 00:00:00 2001 From: Odonno Date: Mon, 11 Aug 2025 22:08:26 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20improve=20parsing=20of=20connection?= =?UTF-8?q?=20string?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SurrealDbOptionsBuilderTests.cs | 4 +++- .../SurrealDbOptionsBuilder.cs | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/SurrealDb.Net.Tests/DependencyInjection/SurrealDbOptionsBuilderTests.cs b/SurrealDb.Net.Tests/DependencyInjection/SurrealDbOptionsBuilderTests.cs index c7f68522..d5efa322 100644 --- a/SurrealDb.Net.Tests/DependencyInjection/SurrealDbOptionsBuilderTests.cs +++ b/SurrealDb.Net.Tests/DependencyInjection/SurrealDbOptionsBuilderTests.cs @@ -305,13 +305,15 @@ public void ShouldSetSensitiveDataLoggingEnabled(bool value, bool expected) [Arguments("'with;semi-colon'", "with;semi-colon")] [Arguments("\"cn$r;'d^u_s4dm%^zr!frxqf\"", "cn$r;'d^u_s4dm%^zr!frxqf")] [Arguments("{cn$r;'d^u_s4dm%^zr!frxqf}", "cn$r;'d^u_s4dm%^zr!frxqf")] + [Arguments("{UjX{N9n4e0p)Q.)_yhkKq", "{UjX{N9n4e0p)Q.)_yhkKq")] + [Arguments("'{UjX{N9n4e0p)Q.)_yhkKq'", "{UjX{N9n4e0p)Q.)_yhkKq")] public void ShouldParseConnectionStringWithSpecialCharsInPassword( string passwordInput, string? expectedPassword ) { string connectionString = - $"Endpoint=http://127.0.0.1:8000;NS=test;DB=test;User=root;Password={passwordInput}"; + $"Endpoint=http://127.0.0.1:8000;User=root;Password={passwordInput};NS=test;DB=test"; var options = new SurrealDbOptionsBuilder().FromConnectionString(connectionString).Build(); diff --git a/SurrealDb.Net/Extensions/DependencyInjection/SurrealDbOptionsBuilder.cs b/SurrealDb.Net/Extensions/DependencyInjection/SurrealDbOptionsBuilder.cs index bc5735a5..7d46a534 100644 --- a/SurrealDb.Net/Extensions/DependencyInjection/SurrealDbOptionsBuilder.cs +++ b/SurrealDb.Net/Extensions/DependencyInjection/SurrealDbOptionsBuilder.cs @@ -76,6 +76,23 @@ public SurrealDbOptionsBuilder FromConnectionString(string connectionString) '{' => '}', _ => throw new InvalidOperationException(), }; + + // 💡 If no "final" char is matched in the next part of the string, then avoid doing it + isPossibleSurroundedPassword = span[(index + 1)..] + .Contains([expectedPasswordLastChar.Value], StringComparison.Ordinal); + if (!isPossibleSurroundedPassword) + { + expectedPasswordLastChar = null; + } + } + + // 💡 Ignore if empty value + if (currentChar == ';') + { + currentPropertyValueEndIndex = index - 1; + + TrySetProperty(ref span); + ResetForNextIteration(); } index++;