mirror of
https://github.com/spring-projects/spring-framework.git
synced 2026-09-17 16:39:29 +00:00
Append query on redirect in UrlHandlerFilter
Closes gh-35873
This commit is contained in:
@@ -299,9 +299,14 @@ public final class UrlHandlerFilter extends OncePerRequestFilter {
|
||||
public void handleInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
|
||||
throws IOException {
|
||||
|
||||
String location = trimTrailingSlash(request.getRequestURI());
|
||||
if (StringUtils.hasText(request.getQueryString())) {
|
||||
location += "?" + request.getQueryString();
|
||||
}
|
||||
|
||||
response.resetBuffer();
|
||||
response.setStatus(this.httpStatus.value());
|
||||
response.setHeader(HttpHeaders.LOCATION, trimTrailingSlash(request.getRequestURI()));
|
||||
response.setHeader(HttpHeaders.LOCATION, location);
|
||||
response.flushBuffer();
|
||||
}
|
||||
}
|
||||
|
||||
+8
-1
@@ -290,9 +290,16 @@ public final class UrlHandlerFilter implements WebFilter {
|
||||
|
||||
@Override
|
||||
public Mono<Void> handleInternal(ServerWebExchange exchange, WebFilterChain chain) {
|
||||
ServerHttpRequest request = exchange.getRequest();
|
||||
String query = request.getURI().getRawQuery();
|
||||
String location = trimTrailingSlash(request);
|
||||
if (StringUtils.hasText(query)) {
|
||||
location += "?" + query;
|
||||
}
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
response.setStatusCode(this.statusCode);
|
||||
response.getHeaders().set(HttpHeaders.LOCATION, trimTrailingSlash(exchange.getRequest()));
|
||||
response.getHeaders().set(HttpHeaders.LOCATION, location);
|
||||
return Mono.empty();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -78,14 +78,18 @@ public class UrlHandlerFilterTests {
|
||||
UrlHandlerFilter filter = UrlHandlerFilter.trailingSlashHandler("/path/*").redirect(status).build();
|
||||
|
||||
String path = "/path/123";
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", path + "/");
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
|
||||
MockFilterChain chain = new MockFilterChain();
|
||||
filter.doFilterInternal(new MockHttpServletRequest("GET", path + "/"), response, chain);
|
||||
|
||||
String queryString = "foo=bar";
|
||||
request.setQueryString(queryString);
|
||||
|
||||
filter.doFilterInternal(request, response, chain);
|
||||
|
||||
assertThat(chain.getRequest()).isNull();
|
||||
assertThat(response.getStatus()).isEqualTo(status.value());
|
||||
assertThat(response.getHeader(HttpHeaders.LOCATION)).isEqualTo(path);
|
||||
assertThat(response.getHeader(HttpHeaders.LOCATION)).isEqualTo(path + "?" + queryString);
|
||||
assertThat(response.isCommitted()).isTrue();
|
||||
}
|
||||
|
||||
|
||||
+3
-2
@@ -64,14 +64,15 @@ public class UrlHandlerFilterTests {
|
||||
UrlHandlerFilter filter = UrlHandlerFilter.trailingSlashHandler("/path/*").redirect(status).build();
|
||||
|
||||
String path = "/path/123";
|
||||
MockServerHttpRequest original = MockServerHttpRequest.get(path + "/").build();
|
||||
String queryString = "foo=bar";
|
||||
MockServerHttpRequest original = MockServerHttpRequest.get(path + "/?" + queryString).build();
|
||||
ServerWebExchange exchange = MockServerWebExchange.from(original);
|
||||
|
||||
assertThatThrownBy(() -> invokeFilter(filter, exchange))
|
||||
.hasMessageContaining("No argument value was captured");
|
||||
|
||||
assertThat(exchange.getResponse().getStatusCode()).isEqualTo(status);
|
||||
assertThat(exchange.getResponse().getHeaders().getLocation()).isEqualTo(URI.create(path));
|
||||
assertThat(exchange.getResponse().getHeaders().getLocation()).isEqualTo(URI.create(path + "?" + queryString));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user