package dev.dinauer.oidcproxy.startup; import dev.dinauer.oidcproxy.startup.model.ConfigRoute; import dev.dinauer.oidcproxy.startup.model.ConfigRules; import io.quarkus.runtime.Startup; import jakarta.enterprise.context.ApplicationScoped; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Strings; import org.apache.commons.lang3.tuple.Pair; import tools.jackson.databind.ObjectMapper; import tools.jackson.dataformat.yaml.YAMLFactory; import java.io.File; import java.util.LinkedList; import java.util.List; import java.util.Optional; @ApplicationScoped public class RouteService { private List routes; @Startup void start() { ConfigRules rules = new ObjectMapper(new YAMLFactory()).readValue(new File("/home/andreas/Documents/dev/oidc-proxy/src/main/resources/routes.yaml"), ConfigRules.class); List result = new LinkedList<>(); for (ConfigRoute route : rules.routes()) { if (StringUtils.isBlank(rules.root())) { result.add(new ProxyRoute(route.path(), route.target(), route.strategy())); } else { result.add(new ProxyRoute(StringUtils.join(rules.root(), route.path()), route.target(), route.strategy())); } } this.routes = result; } public Optional match(List request) { Pair best = null; for (ProxyRoute proxyRoute : this.routes) { Optional match = SegmentMatcher.match(proxyRoute.segments(), request); if (match.isPresent()) { int matchLength = match.get(); if (best == null || best.getLeft() < matchLength) { best = Pair.ofNonNull(matchLength, proxyRoute); } } } if (best != null) { return Optional.of(best.getRight()); } return Optional.empty(); } }