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/"));
+ }
+
+}