From be5d5fa52df7bd84f338f8cb0fda4d7cba904ee4 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Mon, 2 Sep 2024 15:29:42 +0200 Subject: [PATCH] UrlHandlerFilter should not strip slash for "/" request paths This commit ensures that the `UrlHandlerFilter` does not handle "/" paths in general, as they should not be altered and are meaningful for web applications. Closes gh-33444 --- .../web/filter/UrlHandlerFilter.java | 2 +- .../web/filter/UrlHandlerFilterTests.java | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/spring-web/src/main/java/org/springframework/web/filter/UrlHandlerFilter.java b/spring-web/src/main/java/org/springframework/web/filter/UrlHandlerFilter.java index 3e275bb360..ef805b2bf1 100644 --- a/spring-web/src/main/java/org/springframework/web/filter/UrlHandlerFilter.java +++ b/spring-web/src/main/java/org/springframework/web/filter/UrlHandlerFilter.java @@ -279,7 +279,7 @@ public final class UrlHandlerFilter extends OncePerRequestFilter { @Override public boolean canHandle(HttpServletRequest request, RequestPath path) { List elements = path.elements(); - return (!elements.isEmpty() && elements.get(elements.size() - 1).value().equals("/")); + return (elements.size() > 1 && elements.get(elements.size() - 1).value().equals("/")); } @Override diff --git a/spring-web/src/test/java/org/springframework/web/filter/UrlHandlerFilterTests.java b/spring-web/src/test/java/org/springframework/web/filter/UrlHandlerFilterTests.java index b7585744fe..f8dec6ba1f 100644 --- a/spring-web/src/test/java/org/springframework/web/filter/UrlHandlerFilterTests.java +++ b/spring-web/src/test/java/org/springframework/web/filter/UrlHandlerFilterTests.java @@ -69,6 +69,23 @@ public class UrlHandlerFilterTests { assertThat(actual.getPathInfo()).isEqualTo(pathInfo); } + @Test + void shouldNotSkipTrailingSlashForRootPath() throws Exception { + UrlHandlerFilter filter = UrlHandlerFilter.trailingSlashHandler("/**").wrapRequest().build(); + MockHttpServletRequest request = new MockHttpServletRequest("GET", "/"); + request.setPathInfo("/"); + + MockFilterChain chain = new MockFilterChain(); + filter.doFilterInternal(request, new MockHttpServletResponse(), chain); + + HttpServletRequest actual = (HttpServletRequest) chain.getRequest(); + assertThat(actual).isNotNull().isSameAs(request); + assertThat(actual.getRequestURI()).isEqualTo("/"); + assertThat(actual.getRequestURL().toString()).isEqualTo("http://localhost/"); + assertThat(actual.getServletPath()).isEqualTo(""); + assertThat(actual.getPathInfo()).isEqualTo("/"); + } + @Test void noTrailingSlashWithRequestWrapping() throws Exception { testNoTrailingSlashWithRequestWrapping("/path/**", "/path/123");