diff --git a/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/filter/headers/XForwardedHeadersFilter.java b/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/filter/headers/XForwardedHeadersFilter.java index 584cb6b1c..2e4bc4012 100644 --- a/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/filter/headers/XForwardedHeadersFilter.java +++ b/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/filter/headers/XForwardedHeadersFilter.java @@ -237,7 +237,8 @@ public HttpHeaders filter(HttpHeaders input, ServerWebExchange exchange) { if (isForEnabled()) { String remoteAddr = null; - if (request.getRemoteAddress() != null && request.getRemoteAddress().getAddress() != null) { + if (request.getRemoteAddress() != null) { + // Support unresolved addresses (getAddress() may be null) remoteAddr = request.getRemoteAddress().getHostString(); } // match xforwarded for against trusted proxies diff --git a/spring-cloud-gateway-server-webflux/src/test/java/org/springframework/cloud/gateway/filter/headers/XForwardedHeadersFilterTests.java b/spring-cloud-gateway-server-webflux/src/test/java/org/springframework/cloud/gateway/filter/headers/XForwardedHeadersFilterTests.java index 5a32b6712..40d3c2949 100644 --- a/spring-cloud-gateway-server-webflux/src/test/java/org/springframework/cloud/gateway/filter/headers/XForwardedHeadersFilterTests.java +++ b/spring-cloud-gateway-server-webflux/src/test/java/org/springframework/cloud/gateway/filter/headers/XForwardedHeadersFilterTests.java @@ -91,6 +91,27 @@ public void xForwardedHeadersDoNotExist() throws Exception { assertThat(headers.getFirst(X_FORWARDED_PROTO_HEADER)).isEqualTo("http"); } + @Test + public void unresolvedRemoteAddressAddsXForwardedForHeader() { + // Create unresolved InetSocketAddress (this is the actual bug scenario) + InetSocketAddress unresolved = InetSocketAddress.createUnresolved("example.com", 80); + + MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost:8080/get") + .remoteAddress(unresolved) + .header(HttpHeaders.HOST, "myhost") + .build(); + + XForwardedHeadersFilter filter = new XForwardedHeadersFilter(ALLOW_ALL_REGEX); + + HttpHeaders headers = filter.filter(request.getHeaders(), MockServerWebExchange.from(request)); + + // Verify header is present (this currently fails before your fix) + assertThat(headers.headerNames()).contains(X_FORWARDED_FOR_HEADER); + + // Verify it uses host string (not null) + assertThat(headers.getFirst(X_FORWARDED_FOR_HEADER)).isEqualTo("example.com"); + } + @Test public void defaultPort() throws Exception { MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost/get")