Fix an off-by-one bug in ForwardedHeaderTransformer

Consistently with what is done in ForwardedHeaderFilter.

Closes gh-33465
This commit is contained in:
Sébastien Deleuze
2024-09-04 16:10:30 +02:00
parent 83be0f2dac
commit 4b7292f431
3 changed files with 25 additions and 2 deletions

View File

@@ -48,6 +48,7 @@ import static org.mockito.Mockito.mock;
* @author Eddú Meléndez
* @author Rob Winch
* @author Brian Clozel
* @author Sebastien Deleuze
*/
class ForwardedHeaderFilterTests {
@@ -442,6 +443,15 @@ class ForwardedHeaderFilterTests {
assertThat(actual.getRequestURL().toString()).isEqualTo("http://localhost/first/second/mvc-showcase");
}
@Test
void shouldRemoveSingleTrailingSlash() throws Exception {
request.addHeader(X_FORWARDED_PREFIX, "/prefix,/");
request.setRequestURI("/mvc-showcase");
HttpServletRequest actual = filterAndGetWrappedRequest();
assertThat(actual.getRequestURL().toString()).isEqualTo("http://localhost/prefix/mvc-showcase");
}
@Test
void requestURLNewStringBuffer() throws Exception {
request.addHeader(X_FORWARDED_PREFIX, "/prefix/");

View File

@@ -32,6 +32,7 @@ import static org.assertj.core.api.Assertions.assertThat;
* Tests for {@link ForwardedHeaderTransformer}.
*
* @author Rossen Stoyanchev
* @author Sebastien Deleuze
*/
class ForwardedHeaderTransformerTests {
@@ -170,6 +171,17 @@ class ForwardedHeaderTransformerTests {
assertForwardedHeadersRemoved(request);
}
@Test // gh-33465
void shouldRemoveSingleTrailingSlash() {
HttpHeaders headers = new HttpHeaders();
headers.add("X-Forwarded-Prefix", "/prefix,/");
ServerHttpRequest request = this.requestMutator.apply(getRequest(headers));
assertThat(request.getURI()).isEqualTo(URI.create("https://example.com/prefix/path"));
assertThat(request.getPath().value()).isEqualTo("/prefix/path");
assertForwardedHeadersRemoved(request);
}
@Test
void forwardedForNotPresent() {
HttpHeaders headers = new HttpHeaders();