diff --git a/src/Geta.404Handler/Core/CustomRedirects/CustomRedirectCollection.cs b/src/Geta.404Handler/Core/CustomRedirects/CustomRedirectCollection.cs index 2be62a3..66a5ba1 100644 --- a/src/Geta.404Handler/Core/CustomRedirects/CustomRedirectCollection.cs +++ b/src/Geta.404Handler/Core/CustomRedirects/CustomRedirectCollection.cs @@ -144,7 +144,7 @@ string RemoveSlash(string s) } var redirCopy = new CustomRedirect(cr); - var newUrl = AppendSlash(redirCopy.NewUrl); + var newUrl = url.IndexOf("?", StringComparison.Ordinal) > 0 ? redirCopy.NewUrl : AppendSlash(redirCopy.NewUrl); var appendSegment = RemoveSlash(url.Substring(oldUrl.Length)); redirCopy.NewUrl = $"{newUrl}{appendSegment}"; return redirCopy; diff --git a/tests/Geta.404Handler.Tests/CustomRedirectCollectionTests.cs b/tests/Geta.404Handler.Tests/CustomRedirectCollectionTests.cs index c124919..be6cb04 100644 --- a/tests/Geta.404Handler.Tests/CustomRedirectCollectionTests.cs +++ b/tests/Geta.404Handler.Tests/CustomRedirectCollectionTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Web; using BVNetwork.NotFound.Core; @@ -276,5 +276,65 @@ public void Find_gives_nullreferenceexception_with_partial_deleted_hit() Assert.NotNull(actual); } + + /// + /// https://github.com/Geta/404handler/issues/171 + /// + [Fact] + public void Find_does_not_add_slash_when_querystring_parameter() + { + var collection = new CustomRedirectCollection + { + new CustomRedirect("/content/file", "/legacy"), + new CustomRedirect("/content/file/", "/legacy/") + }; + + var urlToFind = "/content/file?doc=filename"; + var expected = "/legacy?doc=filename"; + + var actual = collection.Find(urlToFind.ToUri()); + + Assert.Equal(expected, actual.NewUrl); + } + + /// + /// https://github.com/Geta/404handler/issues/171 + /// + [Fact] + public void Find_does_keep_slash_when_querystring_parameter() + { + var collection = new CustomRedirectCollection + { + new CustomRedirect("/content/file", "/legacy"), + new CustomRedirect("/content/file/", "/legacy/") + }; + + var urlToFind = "/content/file/?doc=filename"; + var expected = "/legacy/?doc=filename"; + + var actual = collection.Find(urlToFind.ToUri()); + + Assert.Equal(expected, actual.NewUrl); + } + + /// + /// https://github.com/Geta/404handler/issues/171 + /// + [Fact] + public void Find_does_not_add_slash_when_querystring_parameters() + { + var collection = new CustomRedirectCollection + { + new CustomRedirect("/content/file", "/legacy"), + new CustomRedirect("/content/file/", "/legacy/") + }; + + var urlToFind = "/content/file?doc=filename¶m2=value"; + var expected = "/legacy?doc=filename¶m2=value"; + + var actual = collection.Find(urlToFind.ToUri()); + + Assert.Equal(expected, actual.NewUrl); + } } -} \ No newline at end of file +}