aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjonmv <venstad@gmail.com>2024-06-24 18:17:54 +0200
committerjonmv <venstad@gmail.com>2024-06-27 13:08:18 +0200
commit52e376bb4f201fa42d8c3e1bcdc78cace46a9004 (patch)
tree834116a890b9cdffa41f9abcecc63bdc55aa8038
parent198193651d7e529445c14b330d66b8bccec0351e (diff)
Propagate wrapped dependencies
-rw-r--r--container-core/src/main/java/com/yahoo/container/http/filter/FilterChainRepository.java7
-rw-r--r--container-disc/src/test/java/com/yahoo/container/jdisc/FilterBindingsProviderTest.java79
2 files changed, 86 insertions, 0 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 10f8400fa37..80693d2ef72 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
@@ -7,6 +7,7 @@ import com.yahoo.component.ComponentSpecification;
import com.yahoo.component.chain.Chain;
import com.yahoo.component.chain.ChainedComponent;
import com.yahoo.component.chain.ChainsConfigurer;
+import com.yahoo.component.chain.dependencies.Dependencies;
import com.yahoo.component.chain.model.ChainsModel;
import com.yahoo.component.chain.model.ChainsModelBuilder;
import com.yahoo.component.provider.ComponentRegistry;
@@ -185,6 +186,12 @@ public class FilterChainRepository extends AbstractComponent {
this.filterType = getFilterType(filter);
}
+ @Override
+ protected Dependencies getDefaultAnnotatedDependencies() {
+ return filter instanceof ChainedComponent chainedComponent ? chainedComponent.getDependencies()
+ : super.getDefaultAnnotatedDependencies();
+ }
+
private static Class<?> getFilterType(Object filter) {
if (filter instanceof RequestFilter)
return RequestFilter.class;
diff --git a/container-disc/src/test/java/com/yahoo/container/jdisc/FilterBindingsProviderTest.java b/container-disc/src/test/java/com/yahoo/container/jdisc/FilterBindingsProviderTest.java
index 7acbaa73fe4..44a7578fd9f 100644
--- a/container-disc/src/test/java/com/yahoo/container/jdisc/FilterBindingsProviderTest.java
+++ b/container-disc/src/test/java/com/yahoo/container/jdisc/FilterBindingsProviderTest.java
@@ -2,15 +2,29 @@
package com.yahoo.container.jdisc;
import com.yahoo.component.ComponentId;
+import com.yahoo.component.ComponentSpecification;
+import com.yahoo.component.chain.ChainedComponent;
+import com.yahoo.component.chain.dependencies.After;
+import com.yahoo.component.chain.dependencies.Before;
+import com.yahoo.component.chain.dependencies.Provides;
import com.yahoo.component.provider.ComponentRegistry;
import com.yahoo.container.core.ChainsConfig;
+import com.yahoo.container.core.ChainsConfig.Chains;
+import com.yahoo.container.core.ChainsConfig.Components;
+import com.yahoo.container.core.ChainsConfig.Components.Builder;
import com.yahoo.container.http.filter.FilterChainRepository;
+import com.yahoo.jdisc.handler.ResponseHandler;
import com.yahoo.jdisc.http.ServerConfig;
+import com.yahoo.jdisc.http.filter.DiscFilterRequest;
import com.yahoo.jdisc.http.filter.RequestFilter;
import com.yahoo.jdisc.http.filter.ResponseFilter;
+import com.yahoo.jdisc.http.filter.SecurityRequestFilter;
+import com.yahoo.jdisc.http.filter.SecurityRequestFilterChain;
import com.yahoo.jdisc.http.server.jetty.FilterBindings;
import org.junit.jupiter.api.Test;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@@ -50,6 +64,71 @@ public class FilterBindingsProviderTest {
}
@Test
+ void requireThatChainOrderIsCorrect() {
+
+ List<ChainedComponent> filteredBy = new ArrayList<>();
+
+ class DummyFilter extends ChainedComponent implements SecurityRequestFilter {
+ @Override public void filter(DiscFilterRequest request, ResponseHandler handler) { filteredBy.add(this); }
+ @Override public String toString() { return getClass().getAnnotation(Provides.class).value()[0]; }
+ }
+
+ @Provides("foo") class Filter1 extends DummyFilter { }
+ @Provides("bar") @After("foo") class Filter2 extends DummyFilter { }
+ @Provides("baz") @Before("foo") class Filter3 extends DummyFilter { }
+
+ ComponentRegistry<SecurityRequestFilter> filters = new ComponentRegistry<>();
+
+ SecurityRequestFilter foo = new Filter1();
+ SecurityRequestFilter bar = new Filter2();
+ SecurityRequestFilter baz = new Filter3();
+
+ filters.register(ComponentId.fromString("foo"), foo);
+ filters.register(ComponentId.fromString("bar"), bar);
+ filters.register(ComponentId.fromString("baz"), baz);
+
+ ChainsConfig.Builder oneChain = new ChainsConfig.Builder();
+ oneChain.components(new Components.Builder().id("foo"))
+ .components(new Components.Builder().id("bar"))
+ .components(new Components.Builder().id("baz"))
+ .chains(new Chains.Builder().id("chain")
+ .components("bar")
+ .components("foo")
+ .components("baz"));
+
+ ((SecurityRequestFilterChain) new FilterChainRepository(oneChain.build(),
+ new ComponentRegistry<>(),
+ new ComponentRegistry<>(),
+ filters,
+ new ComponentRegistry<>())
+ .getFilter(ComponentSpecification.fromString("chain"))).filter((DiscFilterRequest) null, null);
+
+ assertEquals(List.of(baz, foo, bar), filteredBy);
+
+ filteredBy.clear();
+ ChainsConfig.Builder childChain = new ChainsConfig.Builder();
+ childChain.components(new Builder().id("foo"))
+ .components(new Builder().id("bar"))
+ .components(new Builder().id("baz"))
+ .chains(new Chains.Builder().id("parent")
+ .components("bar")
+ .components("baz"))
+ .chains(new Chains.Builder().id("child")
+ .components("foo")
+ .inherits("parent"));
+
+ ((SecurityRequestFilterChain) new FilterChainRepository(childChain.build(),
+ new ComponentRegistry<>(),
+ new ComponentRegistry<>(),
+ filters,
+ new ComponentRegistry<>())
+ .getFilter(ComponentSpecification.fromString("child"))).filter((DiscFilterRequest) null, null);
+
+ assertEquals(List.of(baz, foo, bar), filteredBy);
+
+ }
+
+ @Test
void requireThatCorrectlyConfiguredFiltersAreIncluded() {
final String requestFilter1Id = "requestFilter1";
final String requestFilter2Id = "requestFilter2";