From 45d8c0cc27f047106a274ef6ef06bf4fcbdb8b82 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Mon, 9 Dec 2019 17:20:17 +0100 Subject: [PATCH] Fix QueryStringParser (#389) * Fix QueryStringParser * add extra test --- src/WireMock.Net/RequestMessage.cs | 2 +- src/WireMock.Net/Util/QueryStringParser.cs | 3 +- .../Util/QueryStringParserTests.cs | 32 +++++++++++++++++-- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/WireMock.Net/RequestMessage.cs b/src/WireMock.Net/RequestMessage.cs index f89da6a5..9e92062f 100644 --- a/src/WireMock.Net/RequestMessage.cs +++ b/src/WireMock.Net/RequestMessage.cs @@ -170,7 +170,7 @@ namespace WireMock 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 53c399bf..b4f1b039 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 @@ namespace WireMock.Util .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 10f06554..3fccb783 100644 --- a/test/WireMock.Net.Tests/Util/QueryStringParserTests.cs +++ b/test/WireMock.Net.Tests/Util/QueryStringParserTests.cs @@ -188,6 +188,34 @@ namespace WireMock.Net.Tests.Util 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_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() { @@ -227,12 +255,12 @@ namespace WireMock.Net.Tests.Util // 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