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 f5671412..d3941636 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 @@ -25,7 +25,6 @@ import java.util.List; import java.util.Map; import org.jetbrains.annotations.Nullable; - import org.springframework.core.Ordered; import org.springframework.http.HttpHeaders; import org.springframework.http.server.reactive.ServerHttpRequest; @@ -58,7 +57,7 @@ public class ForwardedHeadersFilter implements HttpHeadersFilter, Ordered { List forwardeds = parse(original.get(FORWARDED_HEADER)); for (Forwarded f : forwardeds) { - updated.add(FORWARDED_HEADER, f.toString()); + updated.add(FORWARDED_HEADER, f.toHeaderValue()); } //TODO: add new forwarded 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 21e343fa..dc1df9e3 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 @@ -17,23 +17,18 @@ package org.springframework.cloud.gateway.filter.headers; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import org.junit.Test; - import org.springframework.cloud.gateway.filter.headers.ForwardedHeadersFilter.Forwarded; import org.springframework.http.HttpHeaders; import org.springframework.mock.http.server.reactive.MockServerHttpRequest; import org.springframework.mock.web.server.MockServerWebExchange; import org.springframework.util.StringUtils; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.UnknownHostException; +import java.util.*; + import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.cloud.gateway.filter.headers.ForwardedHeadersFilter.FORWARDED_HEADER; @@ -67,6 +62,36 @@ public class ForwardedHeadersFilterTests { .containsEntry("for", "\"10.0.0.1:80\""); } + @Test + public void forwardedHeaderExists() throws UnknownHostException { + MockServerHttpRequest request = MockServerHttpRequest + .get("http://localhost/get") + .remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) + .header(FORWARDED_HEADER, "for=12.34.56.78;host=example.com;proto=https; for=23.45.67.89") + .build(); + + ForwardedHeadersFilter filter = new ForwardedHeadersFilter(); + + HttpHeaders headers = filter.filter(request.getHeaders(), MockServerWebExchange.from(request)); + + assertThat(headers.get(FORWARDED_HEADER)).hasSize(2); + + + List forwardeds = ForwardedHeadersFilter.parse(headers.get(FORWARDED_HEADER)); + + assertThat(forwardeds).hasSize(2); + Forwarded addedForwardedHeader = forwardeds.get(0); + Forwarded existingForwardedHeader = forwardeds.get(1); + + assertThat(existingForwardedHeader.getValues()) + .containsEntry("proto", "http") + .containsEntry("for", "\"10.0.0.1:80\""); + + assertThat(addedForwardedHeader.getValues()) + .containsEntry("proto", "https") + .containsEntry("for", "23.45.67.89"); + } + @Test public void noHostHeader() throws UnknownHostException { MockServerHttpRequest request = MockServerHttpRequest @@ -92,7 +117,7 @@ public class ForwardedHeadersFilterTests { @Test public void forwardedParsedCorrectly() { - String[] valid = new String[] { + String[] valid = new String[]{ "for=\"_gazonk\"", "for=192.0.2.60;proto=http;by=203.0.113.43", "for=192.0.2.43, for=198.51.100.17", @@ -103,15 +128,15 @@ public class ForwardedHeadersFilterTests { @SuppressWarnings("unchecked") List>> expectedFor = new ArrayList>>() {{ - add(list(map("for", "\"_gazonk\""))); - add(list(map("for", "192.0.2.60", "proto", "http", "by", "203.0.113.43"))); - add(list(map("for", "192.0.2.43"), map("for", "198.51.100.17"))); - add(list(map("for", "12.34.56.78", "host", "example.com", "proto", "https"), - map("for", "23.45.67.89"))); - add(list(map("for", "12.34.56.78"), - map("for", "23.45.67.89", "secret", "egah2CGj55fSJFs"), - map("for", "10.1.2.3"))); - add(list(map("for", "\"[2001:db8:cafe::17]:4711\""))); + add(list(map("for", "\"_gazonk\""))); + add(list(map("for", "192.0.2.60", "proto", "http", "by", "203.0.113.43"))); + add(list(map("for", "192.0.2.43"), map("for", "198.51.100.17"))); + add(list(map("for", "12.34.56.78", "host", "example.com", "proto", "https"), + map("for", "23.45.67.89"))); + add(list(map("for", "12.34.56.78"), + map("for", "23.45.67.89", "secret", "egah2CGj55fSJFs"), + map("for", "10.1.2.3"))); + add(list(map("for", "\"[2001:db8:cafe::17]:4711\""))); }}; for (int i = 0; i < valid.length; i++) {