Fix issue with parsing x-forwarded-host header
Issue: SPR-10701
This commit is contained in:
parent
676f7f9571
commit
1e90d02973
|
|
@ -94,9 +94,20 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder {
|
||||||
public static ServletUriComponentsBuilder fromRequest(HttpServletRequest request) {
|
public static ServletUriComponentsBuilder fromRequest(HttpServletRequest request) {
|
||||||
String scheme = request.getScheme();
|
String scheme = request.getScheme();
|
||||||
int port = request.getServerPort();
|
int port = request.getServerPort();
|
||||||
|
String host = request.getServerName();
|
||||||
|
|
||||||
String header = request.getHeader("X-Forwarded-Host");
|
String xForwardedHostHeader = request.getHeader("X-Forwarded-Host");
|
||||||
String host = StringUtils.hasText(header) ? header: request.getServerName();
|
|
||||||
|
if (StringUtils.hasText(xForwardedHostHeader)) {
|
||||||
|
if (StringUtils.countOccurrencesOf(xForwardedHostHeader, ":") == 1) {
|
||||||
|
String[] hostAndPort = StringUtils.split(xForwardedHostHeader, ":");
|
||||||
|
host = hostAndPort[0];
|
||||||
|
port = Integer.parseInt(hostAndPort[1]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
host = xForwardedHostHeader;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ServletUriComponentsBuilder builder = new ServletUriComponentsBuilder();
|
ServletUriComponentsBuilder builder = new ServletUriComponentsBuilder();
|
||||||
builder.scheme(scheme);
|
builder.scheme(scheme);
|
||||||
|
|
|
||||||
|
|
@ -16,13 +16,14 @@
|
||||||
|
|
||||||
package org.springframework.web.servlet.support;
|
package org.springframework.web.servlet.support;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.springframework.mock.web.test.MockHttpServletRequest;
|
import org.springframework.mock.web.test.MockHttpServletRequest;
|
||||||
import org.springframework.web.context.request.RequestContextHolder;
|
import org.springframework.web.context.request.RequestContextHolder;
|
||||||
import org.springframework.web.context.request.ServletRequestAttributes;
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||||
|
import org.springframework.web.util.UriComponents;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rossen Stoyanchev
|
* @author Rossen Stoyanchev
|
||||||
|
|
@ -93,6 +94,19 @@ public class ServletUriComponentsBuilderTests {
|
||||||
assertEquals("http://anotherHost/mvc-showcase/data/param?foo=123", result);
|
assertEquals("http://anotherHost/mvc-showcase/data/param?foo=123", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SPR-10701
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void fromRequestWithForwardedHostAndPortHeader() {
|
||||||
|
request.addHeader("X-Forwarded-Host", "webtest.foo.bar.com:443");
|
||||||
|
request.setRequestURI("/mvc-showcase/data/param");
|
||||||
|
request.setQueryString("foo=123");
|
||||||
|
UriComponents result = ServletUriComponentsBuilder.fromRequest(request).build();
|
||||||
|
|
||||||
|
assertEquals("webtest.foo.bar.com", result.getHost());
|
||||||
|
assertEquals(443, result.getPort());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void fromContextPath() {
|
public void fromContextPath() {
|
||||||
request.setRequestURI("/mvc-showcase/data/param");
|
request.setRequestURI("/mvc-showcase/data/param");
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue