Skip to content

Commit 3858a69

Browse files
committed
Path RequestPredicate should honor servlet path
Closes gh-23841
1 parent 95af079 commit 3858a69

File tree

3 files changed

+27
-0
lines changed

3 files changed

+27
-0
lines changed

spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultServerRequest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,10 @@
5454
import org.springframework.util.MultiValueMap;
5555
import org.springframework.util.ObjectUtils;
5656
import org.springframework.web.HttpMediaTypeNotSupportedException;
57+
import org.springframework.web.servlet.HandlerMapping;
5758
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
5859
import org.springframework.web.util.UriBuilder;
60+
import org.springframework.web.util.UrlPathHelper;
5961

6062
/**
6163
* {@code ServerRequest} implementation based on a {@link HttpServletRequest}.
@@ -111,6 +113,16 @@ public UriBuilder uriBuilder() {
111113
return ServletUriComponentsBuilder.fromRequest(servletRequest());
112114
}
113115

116+
@Override
117+
public String path() {
118+
String path = (String) servletRequest().getAttribute(HandlerMapping.LOOKUP_PATH);
119+
if (path == null) {
120+
UrlPathHelper helper = new UrlPathHelper();
121+
path = helper.getLookupPathForRequest(servletRequest());
122+
}
123+
return path;
124+
}
125+
114126
@Override
115127
public Headers headers() {
116128
return this.headers;

spring-webmvc/src/main/java/org/springframework/web/servlet/function/support/RouterFunctionMapping.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ private void initMessageConverters() {
168168
@Nullable
169169
@Override
170170
protected Object getHandlerInternal(@NotNull HttpServletRequest servletRequest) throws Exception {
171+
String lookupPath = getUrlPathHelper().getLookupPathForRequest(servletRequest);
172+
servletRequest.setAttribute(LOOKUP_PATH, lookupPath);
171173
if (this.routerFunction != null) {
172174
ServerRequest request = ServerRequest.create(servletRequest, this.messageConverters);
173175
servletRequest.setAttribute(RouterFunctions.REQUEST_ATTRIBUTE, request);

spring-webmvc/src/test/java/org/springframework/web/servlet/function/RequestPredicatesTests.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,19 @@ public void path() {
116116
assertThat(predicate.test(request)).isFalse();
117117
}
118118

119+
@Test
120+
public void servletPath() {
121+
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/foo/bar");
122+
servletRequest.setServletPath("/foo");
123+
ServerRequest request = new DefaultServerRequest(servletRequest, emptyList());
124+
RequestPredicate predicate = RequestPredicates.path("/bar");
125+
assertThat(predicate.test(request)).isTrue();
126+
127+
servletRequest = new MockHttpServletRequest("GET", "/foo");
128+
request = new DefaultServerRequest(servletRequest, emptyList());
129+
assertThat(predicate.test(request)).isFalse();
130+
}
131+
119132
@Test
120133
public void pathNoLeadingSlash() {
121134
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/path");

0 commit comments

Comments
 (0)