Falls back to unresolved hostname in ForwardedHeadersFilter to prevent NPE.

fixes gh-1601
This commit is contained in:
Tobias Gies
2020-03-04 20:10:24 +01:00
committed by Spencer Gibb
parent 97a87144ff
commit 5f48b1d253
2 changed files with 28 additions and 1 deletions

View File

@@ -116,7 +116,10 @@ public class ForwardedHeadersFilter implements HttpHeadersFilter, Ordered {
InetSocketAddress remoteAddress = request.getRemoteAddress();
if (remoteAddress != null) {
String forValue = remoteAddress.getAddress().getHostAddress();
// If remoteAddress is unresolved, calling getHostAddress() would cause a
// NullPointerException.
String forValue = remoteAddress.isUnresolved() ? remoteAddress.getHostName()
: remoteAddress.getAddress().getHostAddress();
int port = remoteAddress.getPort();
if (port >= 0) {
forValue = forValue + ":" + port;

View File

@@ -131,6 +131,30 @@ public class ForwardedHeadersFilterTests {
.containsEntry("for", "\"10.0.0.1:80\"");
}
@Test
public void unresolvedRemoteAddressFallsBackToHostName() throws UnknownHostException {
MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost/get")
.remoteAddress(
InetSocketAddress.createUnresolved("unresolvable-hostname", 80))
.build();
ForwardedHeadersFilter filter = new ForwardedHeadersFilter();
HttpHeaders headers = filter.filter(request.getHeaders(),
MockServerWebExchange.from(request));
assertThat(headers.get(FORWARDED_HEADER)).hasSize(1);
List<Forwarded> forwardeds = ForwardedHeadersFilter
.parse(headers.get(FORWARDED_HEADER));
assertThat(forwardeds).hasSize(1);
Forwarded forwarded = forwardeds.get(0);
assertThat(forwarded.getValues()).containsEntry("proto", "http")
.containsEntry("for", "\"unresolvable-hostname:80\"");
}
@Test
public void forwardedParsedCorrectly() {
String[] valid = new String[] { "for=\"_gazonk\"",