Apply X-Forwarded headers during location transformation.
To support SOAP services behind load balancers and proxies, honor the de facto X-Forwarded-Proto, X-Forwarded-Host, and X-Forwarded-Port headers. Resolves #150. Related: #132.
This commit is contained in:
committed by
Greg L. Turnquist
parent
4338acf2a8
commit
79b7635a6f
@@ -87,8 +87,17 @@ public abstract class LocationTransformerObjectSupport extends TransformerObject
|
||||
* This method is only called when the {@code transformLocations} property is true.
|
||||
*/
|
||||
protected String transformLocation(String location, HttpServletRequest request) {
|
||||
StringBuilder url = new StringBuilder(request.getScheme());
|
||||
url.append("://").append(request.getServerName()).append(':').append(request.getServerPort());
|
||||
|
||||
String xForwardedProto = request.getHeader("X-Forwarded-Proto");
|
||||
String xForwardedHost = request.getHeader("X-Forwarded-Host");
|
||||
String xForwardedPort = request.getHeader("X-Forwarded-Port");
|
||||
|
||||
String scheme = StringUtils.hasText(xForwardedProto) ? xForwardedProto : request.getScheme();
|
||||
String serverName = StringUtils.hasText(xForwardedHost) ? xForwardedHost : request.getServerName();
|
||||
int serverPort = StringUtils.hasText(xForwardedPort) ? Integer.valueOf(xForwardedPort) : request.getServerPort();
|
||||
|
||||
StringBuilder url = new StringBuilder(scheme);
|
||||
url.append("://").append(serverName).append(':').append(serverPort);
|
||||
if (location.startsWith("/")) {
|
||||
// a relative path, prepend the context path
|
||||
url.append(request.getContextPath()).append(location);
|
||||
|
||||
@@ -244,4 +244,43 @@ public class WsdlDefinitionHandlerAdapterTest {
|
||||
|
||||
XmlAssert.assertThat(resultingDocument).and(expectedDocument).ignoreWhitespace().areIdentical();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void handlesForwardedHeadersInRequest() {
|
||||
|
||||
// given
|
||||
request.setScheme("http");
|
||||
request.setServerName("example.com");
|
||||
request.setServerPort(80);
|
||||
request.setContextPath("/context");
|
||||
request.setPathInfo("/service.wsdl");
|
||||
|
||||
request.addHeader("X-Forwarded-Proto", "https");
|
||||
request.addHeader("X-Forwarded-Host", "loadbalancer.com");
|
||||
request.addHeader("X-Forwarded-Port", "8080");
|
||||
|
||||
// when
|
||||
String result = adapter.transformLocation("/service", request);
|
||||
|
||||
// then
|
||||
assertThat(URI.create("https://loadbalancer.com:8080/context/service")).isEqualTo(URI.create(result));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void handlesNoForwardedHeadersInRequest() {
|
||||
|
||||
// given
|
||||
request.setScheme("http");
|
||||
request.setServerName("example.com");
|
||||
request.setServerPort(80);
|
||||
request.setContextPath("/context");
|
||||
request.setPathInfo("/service.wsdl");
|
||||
|
||||
// when
|
||||
String result = adapter.transformLocation("/service", request);
|
||||
|
||||
// then
|
||||
assertThat(URI.create("http://example.com:80/context/service")).isEqualTo(URI.create(result));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user