summaryrefslogtreecommitdiffstats
path: root/container-core
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@yahoo-inc.com>2017-07-24 23:13:32 +0200
committerBjørn Christian Seime <bjorncs@yahoo-inc.com>2017-07-24 23:13:32 +0200
commite44c1b2602f7e2113024099f646b575a486218a8 (patch)
treea6d4b5811eaf313be985e74012b2aa5c466530b3 /container-core
parent29d8904862566ff1176793048fd79f9ff6b545bc (diff)
Add missing wrapping of security filters
Diffstat (limited to 'container-core')
-rw-r--r--container-core/src/main/java/com/yahoo/container/http/filter/FilterChainRepository.java33
1 files changed, 27 insertions, 6 deletions
diff --git a/container-core/src/main/java/com/yahoo/container/http/filter/FilterChainRepository.java b/container-core/src/main/java/com/yahoo/container/http/filter/FilterChainRepository.java
index a736fd1372f..c888aa97ae9 100644
--- a/container-core/src/main/java/com/yahoo/container/http/filter/FilterChainRepository.java
+++ b/container-core/src/main/java/com/yahoo/container/http/filter/FilterChainRepository.java
@@ -21,10 +21,12 @@ import com.yahoo.jdisc.http.filter.chain.RequestFilterChain;
import com.yahoo.jdisc.http.filter.chain.ResponseFilterChain;
import com.yahoo.processing.execution.chain.ChainRegistry;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
+import static java.util.Collections.emptyList;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toSet;
@@ -83,17 +85,36 @@ public class FilterChainRepository extends AbstractComponent {
private static Object toJDiscChain(Chain<FilterWrapper> chain) {
checkFilterTypesCompatible(chain);
List<?> jdiscFilters = chain.components().stream()
- .map(filterWrapper -> filterWrapper.filter)
- .collect(toList());
- Object head = jdiscFilters.get(0);
- if (jdiscFilters.size() == 1) return head;
+ .map(filterWrapper -> filterWrapper.filter)
+ .collect(toList());
+ List<?> wrappedFilters = wrapSecurityFilters(jdiscFilters);
+ Object head = wrappedFilters.get(0);
+ if (wrappedFilters.size() == 1) return head;
else if (head instanceof RequestFilter)
- return RequestFilterChain.newInstance((List<RequestFilter>) jdiscFilters);
+ return RequestFilterChain.newInstance((List<RequestFilter>) wrappedFilters);
else if (head instanceof ResponseFilter)
- return ResponseFilterChain.newInstance((List<ResponseFilter>) jdiscFilters);
+ return ResponseFilterChain.newInstance((List<ResponseFilter>) wrappedFilters);
throw new IllegalStateException();
}
+ private static List<?> wrapSecurityFilters(List<?> filters) {
+ if (filters.isEmpty()) return emptyList();
+ List<Object> aggregatedSecurityFilters = new ArrayList<>();
+ List<Object> wrappedFilters = new ArrayList<>();
+ for (Object filter : filters) {
+ if (isSecurityFilter(filter)) {
+ aggregatedSecurityFilters.add(filter);
+ } else {
+ if (!aggregatedSecurityFilters.isEmpty()) {
+ wrappedFilters.add(createSecurityChain(aggregatedSecurityFilters));
+ aggregatedSecurityFilters.clear();
+ }
+ wrappedFilters.add(filter);
+ }
+ }
+ return wrappedFilters;
+ }
+
private static void checkFilterTypesCompatible(Chain<FilterWrapper> chain) {
Set<ComponentId> requestFilters = chain.components().stream()
.filter(filter -> filter instanceof RequestFilter || filter instanceof SecurityRequestFilter)