From 3858a69c4292189391860f3cd58782846aa80bd5 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Thu, 31 Oct 2019 16:00:02 +0100 Subject: [PATCH] Path RequestPredicate should honor servlet path Closes gh-23841 --- .../web/servlet/function/DefaultServerRequest.java | 12 ++++++++++++ .../function/support/RouterFunctionMapping.java | 2 ++ .../servlet/function/RequestPredicatesTests.java | 13 +++++++++++++ 3 files changed, 27 insertions(+) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultServerRequest.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultServerRequest.java index 7fc8bf8fb9b..4431499f66b 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultServerRequest.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultServerRequest.java @@ -54,8 +54,10 @@ import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.util.ObjectUtils; import org.springframework.web.HttpMediaTypeNotSupportedException; +import org.springframework.web.servlet.HandlerMapping; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; import org.springframework.web.util.UriBuilder; +import org.springframework.web.util.UrlPathHelper; /** * {@code ServerRequest} implementation based on a {@link HttpServletRequest}. @@ -111,6 +113,16 @@ class DefaultServerRequest implements ServerRequest { return ServletUriComponentsBuilder.fromRequest(servletRequest()); } + @Override + public String path() { + String path = (String) servletRequest().getAttribute(HandlerMapping.LOOKUP_PATH); + if (path == null) { + UrlPathHelper helper = new UrlPathHelper(); + path = helper.getLookupPathForRequest(servletRequest()); + } + return path; + } + @Override public Headers headers() { return this.headers; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/support/RouterFunctionMapping.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/support/RouterFunctionMapping.java index f56d3a44eb6..3aa46358d7b 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/support/RouterFunctionMapping.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/support/RouterFunctionMapping.java @@ -168,6 +168,8 @@ public class RouterFunctionMapping extends AbstractHandlerMapping implements Ini @Nullable @Override protected Object getHandlerInternal(@NotNull HttpServletRequest servletRequest) throws Exception { + String lookupPath = getUrlPathHelper().getLookupPathForRequest(servletRequest); + servletRequest.setAttribute(LOOKUP_PATH, lookupPath); if (this.routerFunction != null) { ServerRequest request = ServerRequest.create(servletRequest, this.messageConverters); servletRequest.setAttribute(RouterFunctions.REQUEST_ATTRIBUTE, request); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/RequestPredicatesTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/RequestPredicatesTests.java index d8e13a54845..69e90f8aa44 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/RequestPredicatesTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/RequestPredicatesTests.java @@ -116,6 +116,19 @@ public class RequestPredicatesTests { assertThat(predicate.test(request)).isFalse(); } + @Test + public void servletPath() { + MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/foo/bar"); + servletRequest.setServletPath("/foo"); + ServerRequest request = new DefaultServerRequest(servletRequest, emptyList()); + RequestPredicate predicate = RequestPredicates.path("/bar"); + assertThat(predicate.test(request)).isTrue(); + + servletRequest = new MockHttpServletRequest("GET", "/foo"); + request = new DefaultServerRequest(servletRequest, emptyList()); + assertThat(predicate.test(request)).isFalse(); + } + @Test public void pathNoLeadingSlash() { MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/path");