From 1f00f23e0d413680bcf20948795aca0b10097dfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mete=20Alpaslan=20Kat=C4=B1rc=C4=B1o=C4=9Flu?= Date: Fri, 5 Jun 2020 01:43:17 +0300 Subject: [PATCH] Allows duplicate X-Forwarded-For headers. Fixes gh-826 Fixes gh-1760 --- .../headers/XForwardedHeadersFilter.java | 7 +------ .../headers/XForwardedHeadersFilterTests.java | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/headers/XForwardedHeadersFilter.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/headers/XForwardedHeadersFilter.java index cb032270..d2e93e9b 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/headers/XForwardedHeadersFilter.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/headers/XForwardedHeadersFilter.java @@ -207,12 +207,7 @@ public class XForwardedHeadersFilter implements HttpHeadersFilter, Ordered { if (isForEnabled() && request.getRemoteAddress() != null && request.getRemoteAddress().getAddress() != null) { String remoteAddr = request.getRemoteAddress().getAddress().getHostAddress(); - List xforwarded = original.get(X_FORWARDED_FOR_HEADER); - // prevent duplicates - if (remoteAddr != null - && (xforwarded == null || !xforwarded.contains(remoteAddr))) { - write(updated, X_FORWARDED_FOR_HEADER, remoteAddr, isForAppend()); - } + write(updated, X_FORWARDED_FOR_HEADER, remoteAddr, isForAppend()); } String proto = request.getURI().getScheme(); diff --git a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/headers/XForwardedHeadersFilterTests.java b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/headers/XForwardedHeadersFilterTests.java index 4a550fdd..7d7485d6 100644 --- a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/headers/XForwardedHeadersFilterTests.java +++ b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/headers/XForwardedHeadersFilterTests.java @@ -331,4 +331,23 @@ public class XForwardedHeadersFilterTests { assertThat(headers).isEmpty(); } + @Test + public void allowDuplicateEntriesInXForwardedForHeader() throws Exception { + MockServerHttpRequest request = MockServerHttpRequest + .get("http://localhost:8080/get") + .remoteAddress( + new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80)) + .header(X_FORWARDED_FOR_HEADER, "10.0.0.1") + .build(); + + XForwardedHeadersFilter filter = new XForwardedHeadersFilter(); + + HttpHeaders headers = filter.filter(request.getHeaders(), + MockServerWebExchange.from(request)); + + assertThat(headers).containsKeys(X_FORWARDED_FOR_HEADER); + + assertThat(headers.getFirst(X_FORWARDED_FOR_HEADER)) + .isEqualTo("10.0.0.1,10.0.0.1"); + } }