Commit ea51cfab authored by Andy Wilkinson's avatar Andy Wilkinson

Avoid uri tag explosion when use of path variable is undetected

Previously, WebMvcTags would fall back to using the request’s path
info if Spring MVC’s best matching path pattern attribute was not
available. For non-Spring MVC web frameworks that support path
variables, such as Jersey, this led to an explosion of URI tags that
could exhaust the heap.

Closes gh-12447
parent bc59434b
...@@ -77,8 +77,9 @@ public final class WebMvcTags { ...@@ -77,8 +77,9 @@ public final class WebMvcTags {
/** /**
* Creates a {@code uri} tag based on the URI of the given {@code request}. Uses the * Creates a {@code uri} tag based on the URI of the given {@code request}. Uses the
* {@link HandlerMapping#BEST_MATCHING_PATTERN_ATTRIBUTE} best matching pattern if * {@link HandlerMapping#BEST_MATCHING_PATTERN_ATTRIBUTE} best matching pattern if
* available, falling back to the request's {@link HttpServletRequest#getPathInfo() * available. Falling back to {@code REDIRECTION} for 3xx responses, {@code NOT_FOUND}
* path info} if necessary. * for 404 responses, {@code root} for requests with no path info, and {@code UNKNOWN}
* for all other requests.
* @param request the request * @param request the request
* @param response the response * @param response the response
* @return the uri tag derived from the request * @return the uri tag derived from the request
...@@ -102,7 +103,6 @@ public final class WebMvcTags { ...@@ -102,7 +103,6 @@ public final class WebMvcTags {
if (pathInfo.isEmpty()) { if (pathInfo.isEmpty()) {
return URI_ROOT; return URI_ROOT;
} }
return Tag.of("uri", pathInfo);
} }
return URI_UNKNOWN; return URI_UNKNOWN;
} }
......
...@@ -38,12 +38,6 @@ public class WebMvcTagsTests { ...@@ -38,12 +38,6 @@ public class WebMvcTagsTests {
private final MockHttpServletResponse response = new MockHttpServletResponse(); private final MockHttpServletResponse response = new MockHttpServletResponse();
@Test
public void uriTrailingSlashesAreSuppressed() {
this.request.setPathInfo("//spring/");
assertThat(WebMvcTags.uri(this.request, null).getValue()).isEqualTo("/spring");
}
@Test @Test
public void uriTagValueIsBestMatchingPatternWhenAvailable() { public void uriTagValueIsBestMatchingPatternWhenAvailable() {
this.request.setAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE, this.request.setAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE,
...@@ -53,6 +47,23 @@ public class WebMvcTagsTests { ...@@ -53,6 +47,23 @@ public class WebMvcTagsTests {
assertThat(tag.getValue()).isEqualTo("/spring"); assertThat(tag.getValue()).isEqualTo("/spring");
} }
@Test
public void uriTagValueIsRootWhenRequestHasNoPatternOrPathInfo() {
assertThat(WebMvcTags.uri(this.request, null).getValue()).isEqualTo("root");
}
@Test
public void uriTagValueIsRootWhenRequestHasNoPatternAndSlashPathInfo() {
this.request.setPathInfo("/");
assertThat(WebMvcTags.uri(this.request, null).getValue()).isEqualTo("root");
}
@Test
public void uriTagValueIsUnknownWhenRequestHasNoPatternAndNonRootPathInfo() {
this.request.setPathInfo("/example");
assertThat(WebMvcTags.uri(this.request, null).getValue()).isEqualTo("UNKNOWN");
}
@Test @Test
public void uriTagValueIsRedirectionWhenResponseStatusIs3xx() { public void uriTagValueIsRedirectionWhenResponseStatusIs3xx() {
this.response.setStatus(301); this.response.setStatus(301);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment