diff --git a/extensions/vertx-http/devspace-proxy-core/pom.xml b/extensions/vertx-http/devspace-proxy-core/pom.xml index e9008a47fd3eb..cf99487b7d413 100644 --- a/extensions/vertx-http/devspace-proxy-core/pom.xml +++ b/extensions/vertx-http/devspace-proxy-core/pom.xml @@ -40,6 +40,17 @@ rest-assured test + + io.quarkus + quarkus-junit5 + test + + + junit + junit + 4.13.2 + test + diff --git a/extensions/vertx-http/devspace-proxy-core/src/main/java/io/quarkus/devspace/server/DevProxyServer.java b/extensions/vertx-http/devspace-proxy-core/src/main/java/io/quarkus/devspace/server/DevProxyServer.java index ce7f0e5f512cf..2df92554249f3 100644 --- a/extensions/vertx-http/devspace-proxy-core/src/main/java/io/quarkus/devspace/server/DevProxyServer.java +++ b/extensions/vertx-http/devspace-proxy-core/src/main/java/io/quarkus/devspace/server/DevProxyServer.java @@ -105,6 +105,7 @@ public class ProxySession { volatile long lastPoll; AtomicLong requestId = new AtomicLong(System.currentTimeMillis()); + ProxySession(ServiceProxy proxy, String sessionId, String who) { timerId = vertx.setPeriodic(POLL_TIMEOUT, this::timerCallback); this.proxy = proxy; @@ -223,15 +224,15 @@ void shutdown() { } public static final String CLIENT_API_PATH = "/_dev_proxy_client_"; - public static final String GLOBAL_PROXY_SESSION = "_depot_global"; - public static final String SESSION_HEADER = "X-Depot-Proxy-Session"; - public static final String HEADER_FORWARD_PREFIX = "X-Depot-Fwd-"; - public static final String STATUS_CODE_HEADER = "X-Depot-Status-Code"; - public static final String METHOD_HEADER = "X-Depot-Method"; - public static final String URI_HEADER = "X-Depot-Uri"; - public static final String REQUEST_ID_HEADER = "X-Depot-Request-Id"; - public static final String RESPONSE_LINK = "X-Depot-Response-Path"; - public static final String POLL_LINK = "X-Depot-Poll-Path"; + public static final String GLOBAL_PROXY_SESSION = "_devspace_global"; + public static final String SESSION_HEADER = "X-DevSpace-Session"; + public static final String HEADER_FORWARD_PREFIX = "X-DevSpace-Fwd-"; + public static final String STATUS_CODE_HEADER = "X-DevSpace-Status-Code"; + public static final String METHOD_HEADER = "X-DevSpace-Method"; + public static final String URI_HEADER = "X-DevSpace-Uri"; + public static final String REQUEST_ID_HEADER = "X-DevSpace-Request-Id"; + public static final String RESPONSE_LINK = "X-DevSpace-Response-Path"; + public static final String POLL_LINK = "X-DevSpace-Poll-Path"; protected long POLL_TIMEOUT = 5000; protected static final Logger log = Logger.getLogger(DevProxyServer.class); diff --git a/extensions/vertx-http/devspace-proxy-core/src/main/java/io/quarkus/devspace/server/HeaderParamSessionRouter.java b/extensions/vertx-http/devspace-proxy-core/src/main/java/io/quarkus/devspace/server/HeaderParamSessionRouter.java new file mode 100644 index 0000000000000..16202b3ae4212 --- /dev/null +++ b/extensions/vertx-http/devspace-proxy-core/src/main/java/io/quarkus/devspace/server/HeaderParamSessionRouter.java @@ -0,0 +1,16 @@ +package io.quarkus.devspace.server; + +import io.vertx.ext.web.RoutingContext; + +public class HeaderParamSessionRouter implements RequestSessionRouter { + private final String name; + + public HeaderParamSessionRouter(String name) { + this.name = name; + } + + @Override + public String match(RoutingContext ctx) { + return ctx.request().headers().get(name); + } +} diff --git a/extensions/vertx-http/devspace-proxy-core/src/main/java/io/quarkus/devspace/server/PathParamSessionRouter.java b/extensions/vertx-http/devspace-proxy-core/src/main/java/io/quarkus/devspace/server/PathParamSessionRouter.java new file mode 100644 index 0000000000000..30cf5280269b1 --- /dev/null +++ b/extensions/vertx-http/devspace-proxy-core/src/main/java/io/quarkus/devspace/server/PathParamSessionRouter.java @@ -0,0 +1,33 @@ +package io.quarkus.devspace.server; + +import io.vertx.core.http.HttpServerRequest; +import io.vertx.ext.web.RoutingContext; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class PathParamSessionRouter implements RequestSessionRouter { + private final Pattern pattern; + + public PathParamSessionRouter(String pathExpression) { + String regex = pathExpression.replace("", "(?[^/]+)"); + pattern = Pattern.compile(regex + ".*"); + } + + @Override + public String match(RoutingContext ctx) { + String path = ctx.normalizedPath(); + return match(path); + } + + public String match(String path) { + if (path == null) + return null; + Matcher matcher = pattern.matcher(path); + if (matcher.matches()) { + return matcher.group("service"); + } else { + return null; + } + } +} diff --git a/extensions/vertx-http/devspace-proxy-core/src/main/java/io/quarkus/devspace/server/QueryParamSessionRouter.java b/extensions/vertx-http/devspace-proxy-core/src/main/java/io/quarkus/devspace/server/QueryParamSessionRouter.java new file mode 100644 index 0000000000000..ee8c4a6659374 --- /dev/null +++ b/extensions/vertx-http/devspace-proxy-core/src/main/java/io/quarkus/devspace/server/QueryParamSessionRouter.java @@ -0,0 +1,16 @@ +package io.quarkus.devspace.server; + +import io.vertx.ext.web.RoutingContext; + +public class QueryParamSessionRouter implements RequestSessionRouter { + private final String name; + + public QueryParamSessionRouter(String name) { + this.name = name; + } + + @Override + public String match(RoutingContext ctx) { + return ctx.queryParams().get(name); + } +} diff --git a/extensions/vertx-http/devspace-proxy-core/src/main/java/io/quarkus/devspace/server/RequestSessionRouter.java b/extensions/vertx-http/devspace-proxy-core/src/main/java/io/quarkus/devspace/server/RequestSessionRouter.java new file mode 100644 index 0000000000000..621d6baed8822 --- /dev/null +++ b/extensions/vertx-http/devspace-proxy-core/src/main/java/io/quarkus/devspace/server/RequestSessionRouter.java @@ -0,0 +1,11 @@ +package io.quarkus.devspace.server; + +import io.vertx.core.http.HttpServerRequest; +import io.vertx.ext.web.RoutingContext; + +/** + * + */ +public interface RequestSessionRouter { + String match(RoutingContext ctx); +} diff --git a/extensions/vertx-http/devspace-proxy-core/src/test/java/io/quarkus/devspace/test/MatchTest.java b/extensions/vertx-http/devspace-proxy-core/src/test/java/io/quarkus/devspace/test/MatchTest.java new file mode 100644 index 0000000000000..5a4556523f108 --- /dev/null +++ b/extensions/vertx-http/devspace-proxy-core/src/test/java/io/quarkus/devspace/test/MatchTest.java @@ -0,0 +1,16 @@ +package io.quarkus.devspace.test; + +import io.quarkus.devspace.server.PathParamSessionRouter; +import org.junit.Test; +import org.junit.jupiter.api.Assertions; + +public class MatchTest { + @Test + public void testPathParam() { + PathParamSessionRouter router = new PathParamSessionRouter("/foo/bar/"); + Assertions.assertEquals("bill", router.match("/foo/bar/bill")); + Assertions.assertEquals("bill", router.match("/foo/bar/bill/other/stuff")); + Assertions.assertEquals("bill", router.match("/foo/bar/bill/")); + } + +}