summaryrefslogtreecommitdiffstats
path: root/container-disc/src/main/java/com/yahoo/container
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorn.christian@seime.no>2020-11-11 16:23:46 +0100
committerGitHub <noreply@github.com>2020-11-11 16:23:46 +0100
commit244f51c38338b66ff2f7b01dbef268f76aa3549d (patch)
treec90b7af9cc5448d74576b175a47efba42e414b2c /container-disc/src/main/java/com/yahoo/container
parent3d743e2ab68e2060312d79a8960272f81b36db0d (diff)
Revert "Remove implicit and potensially false dependency on jdisc_http_service"
Diffstat (limited to 'container-disc/src/main/java/com/yahoo/container')
-rw-r--r--container-disc/src/main/java/com/yahoo/container/jdisc/FilterBindingsProvider.java62
-rw-r--r--container-disc/src/main/java/com/yahoo/container/jdisc/FilterUtil.java105
2 files changed, 167 insertions, 0 deletions
diff --git a/container-disc/src/main/java/com/yahoo/container/jdisc/FilterBindingsProvider.java b/container-disc/src/main/java/com/yahoo/container/jdisc/FilterBindingsProvider.java
new file mode 100644
index 00000000000..972f9dd8e18
--- /dev/null
+++ b/container-disc/src/main/java/com/yahoo/container/jdisc/FilterBindingsProvider.java
@@ -0,0 +1,62 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.container.jdisc;
+
+import com.yahoo.component.ComponentId;
+import com.yahoo.component.provider.ComponentRegistry;
+import com.yahoo.container.di.componentgraph.Provider;
+import com.yahoo.container.http.filter.FilterChainRepository;
+import com.yahoo.jdisc.application.BindingRepository;
+import com.yahoo.jdisc.http.ServerConfig;
+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.server.FilterBindings;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Provides filter bindings based on vespa config.
+ *
+ * @author bakksjo
+ */
+public class FilterBindingsProvider implements Provider<FilterBindings> {
+
+ final BindingRepository<RequestFilter> requestFilters = new BindingRepository<>();
+ final BindingRepository<ResponseFilter> responseFilters = new BindingRepository<>();
+
+ public FilterBindingsProvider(ComponentId componentId,
+ ServerConfig config,
+ FilterChainRepository filterChainRepository,
+ ComponentRegistry<SecurityRequestFilter> legacyRequestFilters) {
+ ComponentId serverId = componentId.getNamespace();
+ try {
+ FilterUtil.setupFilters(
+ componentId,
+ legacyRequestFilters,
+ toFilterSpecs(config.filter()),
+ filterChainRepository,
+ requestFilters,
+ responseFilters);
+ } catch (Exception e) {
+ throw new RuntimeException("Invalid config for http server " + serverId, e);
+ }
+ }
+
+ private List<FilterUtil.FilterSpec> toFilterSpecs(List<ServerConfig.Filter> inFilters) {
+ List<FilterUtil.FilterSpec> outFilters = new ArrayList<>();
+ for (ServerConfig.Filter inFilter : inFilters) {
+ outFilters.add(new FilterUtil.FilterSpec(inFilter.id(), inFilter.binding()));
+ }
+ return outFilters;
+ }
+
+ @Override
+ public FilterBindings get() {
+ return new FilterBindings(requestFilters, responseFilters);
+ }
+
+ @Override
+ public void deconstruct() {}
+
+}
diff --git a/container-disc/src/main/java/com/yahoo/container/jdisc/FilterUtil.java b/container-disc/src/main/java/com/yahoo/container/jdisc/FilterUtil.java
new file mode 100644
index 00000000000..24af56788b9
--- /dev/null
+++ b/container-disc/src/main/java/com/yahoo/container/jdisc/FilterUtil.java
@@ -0,0 +1,105 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.container.jdisc;
+
+import com.yahoo.component.ComponentId;
+import com.yahoo.component.ComponentSpecification;
+import com.yahoo.component.provider.ComponentRegistry;
+import com.yahoo.container.http.filter.FilterChainRepository;
+import com.yahoo.jdisc.application.BindingRepository;
+import com.yahoo.jdisc.application.UriPattern;
+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 java.util.List;
+
+/**
+ * Helper class to set up filter binding repositories based on config.
+ *
+ * @author Øyvind Bakksjø
+ */
+class FilterUtil {
+
+ private static final ComponentId SEARCH_SERVER_COMPONENT_ID = ComponentId.fromString("SearchServer");
+
+ private final BindingRepository<RequestFilter> requestFilters;
+ private final BindingRepository<ResponseFilter> responseFilters;
+
+ private FilterUtil(BindingRepository<RequestFilter> requestFilters, BindingRepository<ResponseFilter> responseFilters) {
+ this.requestFilters = requestFilters;
+ this.responseFilters = responseFilters;
+ }
+
+ private void configureFilters(List<FilterSpec> filtersConfig, FilterChainRepository filterChainRepository) {
+ for (FilterSpec filterConfig : filtersConfig) {
+ Object filter = filterChainRepository.getFilter(ComponentSpecification.fromString(filterConfig.getId()));
+ if (filter == null) {
+ throw new RuntimeException("No http filter with id " + filterConfig.getId());
+ }
+ addFilter(filter, filterConfig.getBinding());
+ }
+ }
+
+ private void addFilter(Object filter, String binding) {
+ if (filter instanceof RequestFilter && filter instanceof ResponseFilter) {
+ throw new RuntimeException("The filter " + filter.getClass().getName() +
+ " is unsupported since it's both a RequestFilter and a ResponseFilter.");
+ } else if (filter instanceof RequestFilter) {
+ requestFilters.put(new UriPattern(binding), (RequestFilter) filter);
+ } else if (filter instanceof ResponseFilter) {
+ responseFilters.put(new UriPattern(binding), (ResponseFilter) filter);
+ } else {
+ throw new RuntimeException("Unknown filter type " + filter.getClass().getName());
+ }
+ }
+
+ //TVT: remove
+ private void configureLegacyFilters(ComponentId id, ComponentRegistry<SecurityRequestFilter> legacyRequestFilters) {
+ ComponentId serverName = id.getNamespace();
+ if (SEARCH_SERVER_COMPONENT_ID.equals(serverName) && !legacyRequestFilters.allComponents().isEmpty()) {
+ requestFilters.bind("http://*/*",
+ SecurityRequestFilterChain.newInstance(legacyRequestFilters.allComponents()));
+ }
+ }
+
+ /**
+ * Populates binding repositories with filters based on config.
+ *
+ * @param requestFilters output argument that will be mutated
+ * @param responseFilters output argument that will be mutated
+ */
+ public static void setupFilters(ComponentId componentId,
+ ComponentRegistry<SecurityRequestFilter> legacyRequestFilters,
+ List<FilterSpec> filtersConfig,
+ FilterChainRepository filterChainRepository,
+ BindingRepository<RequestFilter> requestFilters,
+ BindingRepository<ResponseFilter> responseFilters) {
+ FilterUtil filterUtil = new FilterUtil(requestFilters, responseFilters);
+
+ // TODO: remove
+ filterUtil.configureLegacyFilters(componentId, legacyRequestFilters);
+
+ filterUtil.configureFilters(filtersConfig, filterChainRepository);
+ }
+
+ public static class FilterSpec {
+
+ private final String id;
+ private final String binding;
+
+ public FilterSpec(String id, String binding) {
+ this.id = id;
+ this.binding = binding;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getBinding() {
+ return binding;
+ }
+ }
+
+}