diff --git a/pom.xml b/pom.xml index 76de7c6b..d52517da 100644 --- a/pom.xml +++ b/pom.xml @@ -107,11 +107,6 @@ blockhound-junit-platform ${blockhound.version} - - io.projectreactor.tools - blockhound-junit-platform - ${blockhound.version} - diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyResponseBodyGatewayFilterFactory.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyResponseBodyGatewayFilterFactory.java index 76936b50..2332dc87 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyResponseBodyGatewayFilterFactory.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyResponseBodyGatewayFilterFactory.java @@ -261,7 +261,7 @@ public class ModifyResponseBodyGatewayFilterFactory extends private ClientResponse prepareClientResponse(Publisher body, HttpHeaders httpHeaders) { ClientResponse.Builder builder; - builder = ClientResponse.create(exchange.getResponse().getStatusCode(), + builder = ClientResponse.create(exchange.getResponse().getStatusCode(), messageReaders); return builder.headers(headers -> headers.putAll(httpHeaders)) .body(Flux.from(body)).build(); diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/headers/ForwardedHeadersFilter.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/headers/ForwardedHeadersFilter.java index 9cf096b3..8a39b428 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/headers/ForwardedHeadersFilter.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/headers/ForwardedHeadersFilter.java @@ -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; diff --git a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/headers/ForwardedHeadersFilterTests.java b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/headers/ForwardedHeadersFilterTests.java index 0de5b9d8..11c37082 100644 --- a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/headers/ForwardedHeadersFilterTests.java +++ b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/headers/ForwardedHeadersFilterTests.java @@ -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 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\"",