Allows duplicate X-Forwarded-For headers.

Fixes gh-826
Fixes gh-1760
This commit is contained in:
Mete Alpaslan Katırcıoğlu
2020-06-05 01:43:17 +03:00
committed by spencergibb
parent 9ddfb8b703
commit 1f00f23e0d
2 changed files with 20 additions and 6 deletions

View File

@@ -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<String> 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();

View File

@@ -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");
}
}