diff --git a/src/WireMock.Net/Util/QueryStringParser.cs b/src/WireMock.Net/Util/QueryStringParser.cs index 30f862dd..d0c9c390 100644 --- a/src/WireMock.Net/Util/QueryStringParser.cs +++ b/src/WireMock.Net/Util/QueryStringParser.cs @@ -32,7 +32,7 @@ internal static class QueryStringParser { if (part.Length == 2) { - nameValueCollection.Add(part[0], part[1]); + nameValueCollection.Add(part[0], WebUtility.UrlDecode(part[1])); } } diff --git a/test/WireMock.Net.Tests/Util/QueryStringParserTests.cs b/test/WireMock.Net.Tests/Util/QueryStringParserTests.cs index c73a0a70..274d1f3e 100644 --- a/test/WireMock.Net.Tests/Util/QueryStringParserTests.cs +++ b/test/WireMock.Net.Tests/Util/QueryStringParserTests.cs @@ -38,6 +38,21 @@ public class QueryStringParserTests actual.Should().BeEquivalentTo(expectedOutput); } + [Fact] + public void TryParse_Should_Parse_QueryStringWithUrlEncodedValues() + { + // Arrange + var key = "x"; + var value = "rNaCP7hv8UOmS%2FJcujdvLw%3D%3D"; + + // Act + var result = QueryStringParser.TryParse($"{key}={value}", true, out var actual); + + // Assert + result.Should().BeTrue(); + actual.Should().BeEquivalentTo(new Dictionary { { "x", "rNaCP7hv8UOmS/JcujdvLw==" } }); + } + [Fact] public void Parse_WithNullString() {