Skip to content

Commit 79b7635

Browse files
zbynekvavrosgregturn
authored andcommitted
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.
1 parent 4338acf commit 79b7635

File tree

2 files changed

+50
-2
lines changed

2 files changed

+50
-2
lines changed

spring-ws-core/src/main/java/org/springframework/ws/transport/http/LocationTransformerObjectSupport.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,17 @@ protected void transformLocations(XPathExpression xPathExpression, Document defi
8787
* This method is only called when the {@code transformLocations} property is true.
8888
*/
8989
protected String transformLocation(String location, HttpServletRequest request) {
90-
StringBuilder url = new StringBuilder(request.getScheme());
91-
url.append("://").append(request.getServerName()).append(':').append(request.getServerPort());
90+
91+
String xForwardedProto = request.getHeader("X-Forwarded-Proto");
92+
String xForwardedHost = request.getHeader("X-Forwarded-Host");
93+
String xForwardedPort = request.getHeader("X-Forwarded-Port");
94+
95+
String scheme = StringUtils.hasText(xForwardedProto) ? xForwardedProto : request.getScheme();
96+
String serverName = StringUtils.hasText(xForwardedHost) ? xForwardedHost : request.getServerName();
97+
int serverPort = StringUtils.hasText(xForwardedPort) ? Integer.valueOf(xForwardedPort) : request.getServerPort();
98+
99+
StringBuilder url = new StringBuilder(scheme);
100+
url.append("://").append(serverName).append(':').append(serverPort);
92101
if (location.startsWith("/")) {
93102
// a relative path, prepend the context path
94103
url.append(request.getContextPath()).append(location);

spring-ws-core/src/test/java/org/springframework/ws/transport/http/WsdlDefinitionHandlerAdapterTest.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,4 +244,43 @@ public void handleSimpleWsdl11DefinitionWithTransformLocation() throws Exception
244244

245245
XmlAssert.assertThat(resultingDocument).and(expectedDocument).ignoreWhitespace().areIdentical();
246246
}
247+
248+
@Test
249+
public void handlesForwardedHeadersInRequest() {
250+
251+
// given
252+
request.setScheme("http");
253+
request.setServerName("example.com");
254+
request.setServerPort(80);
255+
request.setContextPath("/context");
256+
request.setPathInfo("/service.wsdl");
257+
258+
request.addHeader("X-Forwarded-Proto", "https");
259+
request.addHeader("X-Forwarded-Host", "loadbalancer.com");
260+
request.addHeader("X-Forwarded-Port", "8080");
261+
262+
// when
263+
String result = adapter.transformLocation("/service", request);
264+
265+
// then
266+
assertThat(URI.create("https://loadbalancer.com:8080/context/service")).isEqualTo(URI.create(result));
267+
}
268+
269+
@Test
270+
public void handlesNoForwardedHeadersInRequest() {
271+
272+
// given
273+
request.setScheme("http");
274+
request.setServerName("example.com");
275+
request.setServerPort(80);
276+
request.setContextPath("/context");
277+
request.setPathInfo("/service.wsdl");
278+
279+
// when
280+
String result = adapter.transformLocation("/service", request);
281+
282+
// then
283+
assertThat(URI.create("http://example.com:80/context/service")).isEqualTo(URI.create(result));
284+
}
285+
247286
}

0 commit comments

Comments
 (0)