Add x-forwarded-for-prefix when request matches origin. Fixes #619
This commit is contained in:
@@ -242,11 +242,12 @@ public class XForwardedHeadersFilter implements HttpHeadersFilter, Ordered {
|
||||
|
||||
if(requestUriPath!=null && (originalUriPath.endsWith(requestUriPath))) {
|
||||
prefix = originalUriPath.replace(requestUriPath, "");
|
||||
if (prefix != null && prefix.length() > 0 &&
|
||||
prefix.length() <= originalUri.getPath().length()) {
|
||||
write(updated, X_FORWARDED_PREFIX_HEADER, prefix, isPrefixAppend());
|
||||
}
|
||||
}
|
||||
if (prefix != null && prefix.length() > 0 &&
|
||||
prefix.length() < originalUri.getPath().length()) {
|
||||
write(updated, X_FORWARDED_PREFIX_HEADER, prefix, isPrefixAppend());
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ package org.springframework.cloud.gateway.filter.headers;
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.URI;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.LinkedHashSet;
|
||||
|
||||
import org.junit.Test;
|
||||
@@ -186,6 +187,29 @@ public class XForwardedHeadersFilterTests {
|
||||
assertThat(headers.getFirst(X_FORWARDED_PREFIX_HEADER)).isEqualTo("/prefix");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void prefixAddedWithoutTrailingSlash() throws Exception {
|
||||
MockServerHttpRequest request = MockServerHttpRequest
|
||||
.get("http://originalhost:8080/foo/bar")
|
||||
.remoteAddress(new InetSocketAddress(InetAddress.getByName("10.0.0.1"), 80))
|
||||
.build();
|
||||
|
||||
XForwardedHeadersFilter filter = new XForwardedHeadersFilter();
|
||||
filter.setPrefixAppend(true);
|
||||
filter.setPrefixEnabled(true);
|
||||
|
||||
ServerWebExchange exchange = MockServerWebExchange.from(request);
|
||||
LinkedHashSet<URI> originalUris = new LinkedHashSet<>();
|
||||
originalUris.add(UriComponentsBuilder.fromUriString("http://originalhost:8080/foo/bar").build().toUri());
|
||||
exchange.getAttributes().put(GATEWAY_ORIGINAL_REQUEST_URL_ATTR, originalUris);
|
||||
URI requestUri = UriComponentsBuilder.fromUriString("http://routedservice:8090/").build().toUri();
|
||||
exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, requestUri);
|
||||
|
||||
HttpHeaders headers = filter.filter(request.getHeaders(), exchange);
|
||||
|
||||
assertThat(headers.getFirst(X_FORWARDED_PREFIX_HEADER)).isEqualTo("/foo/bar");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void noPrefixToInfer() throws Exception {
|
||||
MockServerHttpRequest request = MockServerHttpRequest
|
||||
|
||||
Reference in New Issue
Block a user