Adds non-duplicate/non-sensitive headers from original request.

This commit is contained in:
spencergibb
2021-11-01 17:50:56 -04:00
parent 894402aab3
commit 2d266a540e
3 changed files with 28 additions and 14 deletions

View File

@@ -23,7 +23,9 @@ import java.lang.reflect.TypeVariable;
import java.lang.reflect.WildcardType;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashSet;
@@ -344,17 +346,30 @@ public class ProxyExchange<T> {
return rest.exchange(requestEntity, ParameterizedTypeReference.forType(responseType));
}
private void addHeaders(HttpHeaders headers) {
ArrayList<String> headerNames = new ArrayList<>();
webRequest.getHeaderNames().forEachRemaining(headerNames::add);
Set<String> filteredKeys = filterHeaderKeys(headerNames);
filteredKeys.stream().filter(key -> !headers.containsKey(key))
.forEach(header -> headers.addAll(header, Arrays.asList(webRequest.getHeaderValues(header))));
}
private BodyBuilder headers(BodyBuilder builder) {
proxy();
for (String name : filterHeaderKeys(headers)) {
builder.header(name, headers.get(name).toArray(new String[0]));
}
builder.headers(this::addHeaders);
return builder;
}
private Set<String> filterHeaderKeys(HttpHeaders headers) {
return filterHeaderKeys(headers.keySet());
}
private Set<String> filterHeaderKeys(Collection<String> headerNames) {
final Set<String> sensitiveHeaders = this.sensitive != null ? this.sensitive : DEFAULT_SENSITIVE;
return headers.keySet().stream().filter(header -> !sensitiveHeaders.contains(header.toLowerCase()))
return headerNames.stream().filter(header -> !sensitiveHeaders.contains(header.toLowerCase()))
.collect(Collectors.toSet());
}

View File

@@ -239,18 +239,17 @@ public class ProductionConfigurationTests {
@Test
@SuppressWarnings({ "Duplicates", "unchecked" })
public void testSensitiveHeadersOverride() throws Exception {
Map<String, List<String>> headers = rest
.exchange(
RequestEntity.get(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/headers"))
.header("foo", "bar").header("abc", "xyz").header("cookie", "monster").build(),
Map.class)
.getBody();
RequestEntity<Void> request = RequestEntity
.get(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/headers")).header("foo", "bar")
.header("abc", "xyz").header("cookie", "monster").build();
Map<String, List<String>> headers = rest.exchange(request, Map.class).getBody();
assertThat(headers).doesNotContainKey("foo").doesNotContainKey("hello").containsKeys("bar", "abc");
assertThat(headers.get("cookie")).containsOnly("monster");
}
@Test
@SuppressWarnings({ "Duplicates", "unchecked" })
public void testSensitiveHeadersDefault() throws Exception {
Map<String, List<String>> headers = rest.exchange(RequestEntity
.get(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/sensitive-headers-default"))

View File

@@ -178,8 +178,10 @@ public class ProductionConfigurationTests {
@SuppressWarnings({ "Duplicates", "unchecked" })
public void testSensitiveHeadersOverride() throws Exception {
Map<String, List<String>> headers = rest
.exchange(RequestEntity.get(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/headers"))
.header("foo", "bar").header("abc", "xyz").header("cookie", "monster").build(), Map.class)
.exchange(
RequestEntity.get(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/headers"))
.header("foo", "bar").header("abc", "xyz").header("cookie", "monster").build(),
Map.class)
.getBody();
assertThat(headers).doesNotContainKey("foo").doesNotContainKey("hello").containsKeys("bar", "abc");
@@ -188,11 +190,9 @@ public class ProductionConfigurationTests {
@Test
public void testSensitiveHeadersDefault() throws Exception {
Map<String, List<String>> headers = rest
.exchange(RequestEntity.get(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/sensitive-headers-default"))
.header("cookie", "monster")
.build(), Map.class)
.getBody();
Map<String, List<String>> headers = rest.exchange(RequestEntity
.get(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/sensitive-headers-default"))
.header("cookie", "monster").build(), Map.class).getBody();
assertThat(headers).doesNotContainKey("cookie");
}