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 extends DataBuffer> 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\"",