From 907119dfa38ffc1734a6e898935c63b389d995f7 Mon Sep 17 00:00:00 2001 From: Olga Maciaszek-Sharma Date: Fri, 2 Jul 2021 19:00:46 +0200 Subject: [PATCH] Fix 2214 hoxton (#2285) --- .../config/GatewayRedisAutoConfiguration.java | 3 +-- .../headers/ForwardedHeadersFilter.java | 15 ++++++++++-- .../headers/ForwardedHeadersFilterTests.java | 24 +++++++++++++++++++ 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayRedisAutoConfiguration.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayRedisAutoConfiguration.java index 78ee06ad..e912d1c9 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayRedisAutoConfiguration.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayRedisAutoConfiguration.java @@ -44,8 +44,7 @@ import org.springframework.web.reactive.DispatcherHandler; @AutoConfigureBefore(GatewayAutoConfiguration.class) @ConditionalOnBean(ReactiveRedisTemplate.class) @ConditionalOnClass({ RedisTemplate.class, DispatcherHandler.class }) -@ConditionalOnProperty(name = "spring.cloud.gateway.redis.enabled", - matchIfMissing = true) +@ConditionalOnProperty(name = "spring.cloud.gateway.redis.enabled", matchIfMissing = true) class GatewayRedisAutoConfiguration { @Bean diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/headers/ForwardedHeadersFilter.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/headers/ForwardedHeadersFilter.java index 6f24c512..04592e28 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/headers/ForwardedHeadersFilter.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/headers/ForwardedHeadersFilter.java @@ -16,6 +16,8 @@ package org.springframework.cloud.gateway.filter.headers; +import java.net.Inet6Address; +import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.URI; import java.util.ArrayList; @@ -120,8 +122,17 @@ public class ForwardedHeadersFilter implements HttpHeadersFilter, Ordered { if (remoteAddress != null) { // If remoteAddress is unresolved, calling getHostAddress() would cause a // NullPointerException. - String forValue = remoteAddress.isUnresolved() ? remoteAddress.getHostName() - : remoteAddress.getAddress().getHostAddress(); + String forValue; + if (remoteAddress.isUnresolved()) { + forValue = remoteAddress.getHostName(); + } + else { + InetAddress address = remoteAddress.getAddress(); + forValue = remoteAddress.getAddress().getHostAddress(); + if (address instanceof Inet6Address) { + forValue = "[" + forValue + "]"; + } + } int port = remoteAddress.getPort(); if (port >= 0) { forValue = forValue + ":" + port; diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/ForwardedHeadersFilterTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/ForwardedHeadersFilterTests.java index c7e8e9e4..4d6b0104 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/ForwardedHeadersFilterTests.java +++ b/spring-cloud-gateway-server/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 correctIPv6RemoteAddressMapping() throws UnknownHostException { + MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost/get") + .remoteAddress(new InetSocketAddress( + InetAddress.getByName("2001:db8:cafe:0:0:0:0:17"), 80)) + .header(HttpHeaders.HOST, "myhost").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("for", + "\"[2001:db8:cafe:0:0:0:0:17]:80\""); + } + @Test public void unresolvedRemoteAddressFallsBackToHostName() throws UnknownHostException { MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost/get")