diff --git a/artemis-pom/pom.xml b/artemis-pom/pom.xml
index 94a373723a3..ca2474843e9 100644
--- a/artemis-pom/pom.xml
+++ b/artemis-pom/pom.xml
@@ -595,6 +595,12 @@
${jetty-servlet-api.version}
+
+ org.eclipse.jetty
+ jetty-unixdomain-server
+ ${jetty.version}
+
+
diff --git a/artemis-web/pom.xml b/artemis-web/pom.xml
index 65ce42f6c81..e9133cbd89e 100644
--- a/artemis-web/pom.xml
+++ b/artemis-web/pom.xml
@@ -102,6 +102,10 @@
org.eclipse.jetty
jetty-alpn-java-server
+
+ org.eclipse.jetty
+ jetty-unixdomain-server
+
org.apache.activemq
artemis-server
diff --git a/artemis-web/src/main/java/org/apache/activemq/artemis/component/WebServerComponent.java b/artemis-web/src/main/java/org/apache/activemq/artemis/component/WebServerComponent.java
index 316b0e31205..2d38daf60ee 100644
--- a/artemis-web/src/main/java/org/apache/activemq/artemis/component/WebServerComponent.java
+++ b/artemis-web/src/main/java/org/apache/activemq/artemis/component/WebServerComponent.java
@@ -63,6 +63,7 @@
import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory;
import org.eclipse.jetty.server.ConnectionFactory;
+import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.CustomRequestLog;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.HttpConfiguration;
@@ -75,6 +76,7 @@
import org.eclipse.jetty.server.SslConnectionFactory;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.ResourceHandler;
+import org.eclipse.jetty.unixdomain.server.UnixDomainServerConnector;
import org.eclipse.jetty.util.Scanner;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
@@ -107,7 +109,7 @@ public class WebServerComponent implements ExternalComponent, WebServerComponent
private final List consoleUrls = new ArrayList<>();
private final List jolokiaUrls = new ArrayList<>();
private final List> webContextData = new ArrayList<>();
- private ServerConnector[] connectors;
+ private Connector[] connectors;
private Path artemisHomePath;
private Path temporaryWarDir;
private String artemisInstance;
@@ -168,9 +170,10 @@ public synchronized void start() throws Exception {
}
}
+ httpConfiguration.setSendServerVersion(false);
+
List bindings = this.webServerConfig.getAllBindings();
- connectors = new ServerConnector[bindings.size()];
- String[] virtualHosts = new String[bindings.size()];
+ connectors = new Connector[bindings.size()];
this.artemisHomePath = Paths.get(Objects.requireNonNullElse(artemisHome, "."));
Path homeWarDir = artemisHomePath.resolve(this.webServerConfig.path).toAbsolutePath();
@@ -180,10 +183,18 @@ public synchronized void start() throws Exception {
BindingDTO binding = bindings.get(i);
URI uri = new URI(binding.uri);
String scheme = uri.getScheme();
- ServerConnector connector = createServerConnector(httpConfiguration, i, binding, uri, scheme);
- connectors[i] = connector;
- virtualHosts[i] = "@Connector-" + i;
+ if ("http".equals(scheme) || "https".equals(scheme)) {
+ ServerConnector connector = createServerConnector(httpConfiguration, binding, uri, scheme);
+ connectors[i] = connector;
+ }
+ else if ("unix".equals(scheme)) {
+ UnixDomainServerConnector connector = createUnixDomainServerConnector(httpConfiguration, binding, uri);
+ connectors[i] = connector;
+ } else {
+ System.out.println("Scheme " + scheme + " is not supported!");
+ connectors[i] = null;
+ }
if (binding.apps != null && !binding.apps.isEmpty()) {
for (AppDTO app : binding.apps) {
@@ -191,10 +202,13 @@ public synchronized void start() throws Exception {
if (new File(instanceWarDir.toFile() + File.separator + app.war).exists()) {
dirToUse = instanceWarDir;
}
- WebAppContext webContext = createWebAppContext(app.url, app.war, dirToUse, virtualHosts[i]);
+ WebAppContext webContext;
+ webContext = createWebAppContext(app.url, app.war, dirToUse, null);
handlers.addHandler(webContext);
webContext.getSessionHandler().getSessionCookieConfig().setComment("__SAME_SITE_STRICT__");
- webContext.getSessionHandler().getSessionCookieConfig().setName("JSESSIONID_" + i + "_" + connector.getPort());
+ if ("http".equals(scheme) || "unix".equals(scheme)) {
+ webContext.getSessionHandler().getSessionCookieConfig().setName("JSESSIONID_" + i + "_" + 8161);
+ }
webContext.getSessionHandler().setSessionPath(webContext.getContextPath());
webContext.addEventListener(new ServletContextListener() {
@Override
@@ -224,7 +238,6 @@ public void requestDestroyed(ServletRequestEvent sre) {
homeContext.setContextPath("/");
homeContext.setBaseResourceAsPath(homeWarDir);
homeContext.setHandler(homeResourceHandler);
- homeContext.setVirtualHosts(Arrays.asList(virtualHosts));
ResourceHandler instanceResourceHandler = new ResourceHandler();
instanceResourceHandler.setDirAllowed(false);
@@ -234,7 +247,6 @@ public void requestDestroyed(ServletRequestEvent sre) {
instanceContext.setContextPath("/");
instanceContext.setBaseResourceAsPath(instanceWarDir);
instanceContext.setHandler(instanceResourceHandler);
- instanceContext.setVirtualHosts(Arrays.asList(virtualHosts));
DefaultHandler defaultHandler = new DefaultHandler();
defaultHandler.setServeFavIcon(false);
@@ -282,7 +294,6 @@ private void printStatus(List bindings) {
}
private ServerConnector createServerConnector(HttpConfiguration httpConfiguration,
- int i,
BindingDTO binding,
URI uri,
String scheme) throws Exception {
@@ -329,7 +340,6 @@ private ServerConnector createServerConnector(HttpConfiguration httpConfiguratio
secureRequestCustomizer.setSniHostCheck(Objects.requireNonNullElse(binding.getSniHostCheck(), DEFAULT_SNI_HOST_CHECK_VALUE));
secureRequestCustomizer.setSniRequired(Objects.requireNonNullElse(binding.getSniRequired(), DEFAULT_SNI_REQUIRED_VALUE));
httpConfiguration.addCustomizer(secureRequestCustomizer);
- httpConfiguration.setSendServerVersion(false);
HttpConnectionFactory httpFactory = new HttpConnectionFactory(httpConfiguration);
if (Boolean.FALSE.equals(binding.getHttp2())) {
@@ -342,17 +352,35 @@ private ServerConnector createServerConnector(HttpConfiguration httpConfiguratio
SslConnectionFactory sslConnectionFactory = new SslConnectionFactory(sslFactory, alpn.getProtocol());
connector = new ServerConnector(server, sslConnectionFactory, alpn, h2, httpFactory);
}
+ connector.setPort(uri.getPort());
+ connector.setHost(uri.getHost());
} else {
- httpConfiguration.setSendServerVersion(false);
ConnectionFactory connectionFactory = new HttpConnectionFactory(httpConfiguration);
connector = new ServerConnector(server, connectionFactory);
+ connector.setPort(uri.getPort());
+ connector.setHost(uri.getHost());
}
- connector.setPort(uri.getPort());
- connector.setHost(uri.getHost());
- connector.setName("Connector-" + i);
return connector;
}
+ private UnixDomainServerConnector createUnixDomainServerConnector(HttpConfiguration httpConfiguration, BindingDTO binding, URI uri) throws Exception {
+ UnixDomainServerConnector connector;
+ ConnectionFactory connectionFactory = new HttpConnectionFactory(httpConfiguration);
+ connector = new UnixDomainServerConnector(server, connectionFactory);
+ connector.setUnixDomainPath(getUnixPath(uri));
+ return connector;
+ }
+
+ private Path getUnixPath(URI uri) {
+ String uriString = uri.toString();
+ String path = uriString.substring(7, uriString.length());
+
+ if (path == null || path.isEmpty()) {
+ throw new IllegalArgumentException("Unix domain socket URI must have a valid path: " + uri);
+ }
+ return Path.of(path);
+ }
+
private File getStoreFile(String storeFilename) {
File storeFile = new File(storeFilename);
if (!storeFile.exists())
@@ -496,8 +524,8 @@ public int getPort() {
}
public int getPort(int connectorIndex) {
- if (connectorIndex < connectors.length) {
- return connectors[connectorIndex].getLocalPort();
+ if ((connectorIndex < connectors.length) && connectors[connectorIndex] instanceof ServerConnector) {
+ return ((ServerConnector)connectors[connectorIndex]).getLocalPort();
}
return -1;
}
@@ -523,8 +551,6 @@ protected WebAppContext createWebAppContext(String url, String warFile, Path war
// https://github.com/eclipse/jetty.project/commit/7e91d34177a880ecbe70009e8f200d02e3a0c5dd
webapp.getSecurityHandler().setAuthenticatorFactory(new DefaultAuthenticatorFactory());
- webapp.setVirtualHosts(new String[]{virtualHost});
-
return webapp;
}