From 9449a891a5ee5da61a3489611cfce987da15e81a Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Thu, 5 Dec 2019 18:42:55 +0100 Subject: [PATCH 1/2] Fix QueryStringParser --- .../__admin/mappings/1.cs | 2 +- src/WireMock.Net/RequestMessage.cs | 2 +- src/WireMock.Net/Util/QueryStringParser.cs | 3 ++- .../Util/QueryStringParserTests.cs | 18 ++++++++++++++++-- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/examples/WireMock.Net.Console.NETCoreApp2/__admin/mappings/1.cs b/examples/WireMock.Net.Console.NETCoreApp2/__admin/mappings/1.cs index 3310d6a23..c8143e099 100644 --- a/examples/WireMock.Net.Console.NETCoreApp2/__admin/mappings/1.cs +++ b/examples/WireMock.Net.Console.NETCoreApp2/__admin/mappings/1.cs @@ -1 +1 @@ -C# Hello \ No newline at end of file +// C# Hello \ No newline at end of file diff --git a/src/WireMock.Net/RequestMessage.cs b/src/WireMock.Net/RequestMessage.cs index f89da6a56..9e92062f0 100644 --- a/src/WireMock.Net/RequestMessage.cs +++ b/src/WireMock.Net/RequestMessage.cs @@ -170,7 +170,7 @@ public RequestMessage([NotNull] UrlDetails urlDetails, [NotNull] string method, Headers = headers?.ToDictionary(header => header.Key, header => new WireMockList(header.Value)); Cookies = cookies; - RawQuery = WebUtility.UrlDecode(urlDetails.Url.Query); + RawQuery = urlDetails.Url.Query; Query = QueryStringParser.Parse(RawQuery); } diff --git a/src/WireMock.Net/Util/QueryStringParser.cs b/src/WireMock.Net/Util/QueryStringParser.cs index 53c399bf7..b4f1b039d 100644 --- a/src/WireMock.Net/Util/QueryStringParser.cs +++ b/src/WireMock.Net/Util/QueryStringParser.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net; namespace WireMock.Util { @@ -30,7 +31,7 @@ string[] JoinParts(string[] parts) .Split(new[] { '&', ';' }, StringSplitOptions.RemoveEmptyEntries) // Support "?key=value;key=anotherValue" and "?key=value&key=anotherValue" .Select(parameter => parameter.Split(new[] { '=' }, 2, StringSplitOptions.RemoveEmptyEntries)) .GroupBy(parts => parts[0], JoinParts) - .ToDictionary(grouping => grouping.Key, grouping => new WireMockList(grouping.SelectMany(x => x))); + .ToDictionary(grouping => grouping.Key, grouping => new WireMockList(grouping.SelectMany(x => x).Select(WebUtility.UrlDecode))); } } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/Util/QueryStringParserTests.cs b/test/WireMock.Net.Tests/Util/QueryStringParserTests.cs index 10f06554d..6fd2c0efe 100644 --- a/test/WireMock.Net.Tests/Util/QueryStringParserTests.cs +++ b/test/WireMock.Net.Tests/Util/QueryStringParserTests.cs @@ -188,6 +188,20 @@ public void Parse_With1ParamContainingComma() result["key"].Should().Equal(new WireMockList(new[] { "1", "2", "3" })); } + [Fact] + public void Parse_With1ParamContainingEscapedAnd() + { + // Assign + string query = "?winkel=C%26A"; + + // Act + var result = QueryStringParser.Parse(query); + + // Assert + result.Count.Should().Be(1); + result["winkel"].Should().Equal(new WireMockList(new[] { "C&A" })); + } + [Fact] public void Parse_WithMultipleParamWithSameKey() { @@ -227,12 +241,12 @@ public void Parse_WithComplex() // Assert result.Count.Should().Be(6); - result["q"].Should().Equal(new WireMockList("energy+edge")); + result["q"].Should().Equal(new WireMockList("energy edge")); result["rls"].Should().Equal(new WireMockList("com.microsoft:en-au")); result["ie"].Should().Equal(new WireMockList("UTF-8")); result["oe"].Should().Equal(new WireMockList("UTF-8")); result["startIndex"].Should().Equal(new WireMockList()); - result["startPage"].Should().Equal(new WireMockList("1%22")); + result["startPage"].Should().Equal(new WireMockList("1\"")); } } } \ No newline at end of file From a9404818d74d41294e5057d67775e8998430ec92 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Thu, 5 Dec 2019 19:18:06 +0100 Subject: [PATCH 2/2] add extra test --- .../Util/QueryStringParserTests.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/WireMock.Net.Tests/Util/QueryStringParserTests.cs b/test/WireMock.Net.Tests/Util/QueryStringParserTests.cs index 6fd2c0efe..3fccb783d 100644 --- a/test/WireMock.Net.Tests/Util/QueryStringParserTests.cs +++ b/test/WireMock.Net.Tests/Util/QueryStringParserTests.cs @@ -202,6 +202,20 @@ public void Parse_With1ParamContainingEscapedAnd() result["winkel"].Should().Equal(new WireMockList(new[] { "C&A" })); } + [Fact] + public void Parse_With1ParamContainingParentheses() + { + // Assign + string query = "?Transaction=(123)"; + + // Act + var result = QueryStringParser.Parse(query); + + // Assert + result.Count.Should().Be(1); + result["Transaction"].Should().Equal(new WireMockList(new[] { "(123)" })); + } + [Fact] public void Parse_WithMultipleParamWithSameKey() {