Merge pull request #5563 from eclipse/jetty-10.0.x-5320-WebSocketHttpClient2
Issue #5320 - using jetty-websocket-httpclient.xml within webapp Jetty 10
This commit is contained in:
commit
859cf6cd1c
|
@ -655,6 +655,11 @@
|
|||
<artifactId>websocket-jetty-server</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.eclipse.jetty.websocket</groupId>
|
||||
<artifactId>websocket-jetty-client</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.eclipse.jetty.websocket</groupId>
|
||||
<artifactId>websocket-javax-server</artifactId>
|
||||
|
|
|
@ -30,6 +30,7 @@ import org.eclipse.jetty.osgi.boot.OSGiWebappConstants;
|
|||
import org.eclipse.jetty.util.StringUtil;
|
||||
import org.eclipse.jetty.util.resource.Resource;
|
||||
import org.eclipse.jetty.util.statistic.CounterStatistic;
|
||||
import org.eclipse.jetty.webapp.Configuration;
|
||||
import org.eclipse.jetty.webapp.WebAppContext;
|
||||
import org.osgi.framework.Bundle;
|
||||
import org.osgi.framework.Constants;
|
||||
|
@ -74,6 +75,12 @@ public class AnnotationConfiguration extends org.eclipse.jetty.annotations.Annot
|
|||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<? extends Configuration> replaces()
|
||||
{
|
||||
return org.eclipse.jetty.annotations.AnnotationConfiguration.class;
|
||||
}
|
||||
|
||||
/**
|
||||
* This parser scans the bundles using the OSGi APIs instead of assuming a jar.
|
||||
*/
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
# DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||
|
||||
[description]
|
||||
Enables both Jetty and javax websocket modules for deployed web applications.
|
||||
|
||||
[tags]
|
||||
websocket
|
||||
|
||||
[depend]
|
||||
websocket-jetty
|
||||
websocket-javax
|
|
@ -20,23 +20,15 @@ package org.eclipse.jetty.websocket.core.client;
|
|||
|
||||
import org.eclipse.jetty.client.HttpClient;
|
||||
import org.eclipse.jetty.util.thread.QueuedThreadPool;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public interface HttpClientProvider
|
||||
{
|
||||
static HttpClient get()
|
||||
{
|
||||
try
|
||||
{
|
||||
HttpClientProvider xmlProvider = new XmlHttpClientProvider();
|
||||
HttpClient client = xmlProvider.newHttpClient();
|
||||
if (client != null)
|
||||
return client;
|
||||
}
|
||||
catch (Throwable x)
|
||||
{
|
||||
LoggerFactory.getLogger(HttpClientProvider.class).trace("IGNORED", x);
|
||||
}
|
||||
HttpClientProvider xmlProvider = new XmlHttpClientProvider();
|
||||
HttpClient client = xmlProvider.newHttpClient();
|
||||
if (client != null)
|
||||
return client;
|
||||
|
||||
return HttpClientProvider.newDefaultHttpClient();
|
||||
}
|
||||
|
|
|
@ -33,12 +33,27 @@ class XmlHttpClientProvider implements HttpClientProvider
|
|||
@Override
|
||||
public HttpClient newHttpClient()
|
||||
{
|
||||
URL resource = Thread.currentThread().getContextClassLoader().getResource("jetty-websocket-httpclient.xml");
|
||||
if (resource == null)
|
||||
{
|
||||
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
|
||||
if (contextClassLoader == null)
|
||||
return null;
|
||||
}
|
||||
|
||||
URL resource = contextClassLoader.getResource("jetty-websocket-httpclient.xml");
|
||||
if (resource == null)
|
||||
return null;
|
||||
|
||||
try
|
||||
{
|
||||
Thread.currentThread().setContextClassLoader(HttpClient.class.getClassLoader());
|
||||
return newHttpClient(resource);
|
||||
}
|
||||
finally
|
||||
{
|
||||
Thread.currentThread().setContextClassLoader(contextClassLoader);
|
||||
}
|
||||
}
|
||||
|
||||
private static HttpClient newHttpClient(URL resource)
|
||||
{
|
||||
try
|
||||
{
|
||||
XmlConfiguration configuration = new XmlConfiguration(Resource.newResource(resource));
|
||||
|
@ -46,7 +61,7 @@ class XmlHttpClientProvider implements HttpClientProvider
|
|||
}
|
||||
catch (Throwable t)
|
||||
{
|
||||
LOG.warn("Unable to load: {}", resource, t);
|
||||
LOG.warn("Failure to load HttpClient from XML {}", resource, t);
|
||||
}
|
||||
|
||||
return null;
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
# DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||
|
||||
[description]
|
||||
Enable both Jetty and javax websocket modules for deployed web applications.
|
||||
|
||||
[tags]
|
||||
websocket
|
||||
|
||||
[depend]
|
||||
websocket-jetty
|
||||
websocket-javax
|
|
@ -28,8 +28,7 @@ import org.eclipse.jetty.webapp.WebXmlConfiguration;
|
|||
/**
|
||||
* <p>Websocket Configuration</p>
|
||||
* <p>This configuration configures the WebAppContext server/system classes to
|
||||
* be able to see the org.eclipse.jetty.websocket package.
|
||||
* </p>
|
||||
* be able to see the {@code org.eclipse.jetty.websocket.javax} packages.</p>
|
||||
*/
|
||||
public class JavaxWebSocketConfiguration extends AbstractConfiguration
|
||||
{
|
||||
|
@ -37,6 +36,7 @@ public class JavaxWebSocketConfiguration extends AbstractConfiguration
|
|||
{
|
||||
addDependencies(WebXmlConfiguration.class, MetaInfConfiguration.class, WebInfConfiguration.class, FragmentConfiguration.class);
|
||||
addDependents("org.eclipse.jetty.annotations.AnnotationConfiguration", WebAppConfiguration.class.getName());
|
||||
|
||||
protectAndExpose("org.eclipse.jetty.websocket.util.server."); // For WebSocketUpgradeFilter
|
||||
protectAndExpose("org.eclipse.jetty.websocket.javax.server.config.");
|
||||
protectAndExpose("org.eclipse.jetty.websocket.javax.client.JavaxWebSocketClientContainerProvider");
|
||||
|
|
|
@ -35,6 +35,12 @@
|
|||
<artifactId>jetty-client</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-webapp</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
# DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||
|
||||
[description]
|
||||
Expose the Jetty WebSocket Client classes to deployed web applications.
|
||||
|
||||
[tags]
|
||||
websocket
|
||||
|
||||
[depend]
|
||||
client
|
||||
annotations
|
||||
|
||||
[lib]
|
||||
lib/websocket/websocket-core-common-${jetty.version}.jar
|
||||
lib/websocket/websocket-core-client-${jetty.version}.jar
|
||||
lib/websocket/websocket-util-${jetty.version}.jar
|
||||
lib/websocket/websocket-jetty-api-${jetty.version}.jar
|
||||
lib/websocket/websocket-jetty-common-${jetty.version}.jar
|
||||
lib/websocket/websocket-jetty-client-${jetty.version}.jar
|
||||
|
||||
[jpms]
|
||||
# The implementation needs to access method handles in
|
||||
# classes that are in the web application classloader.
|
||||
add-reads: org.eclipse.jetty.websocket.jetty.common=ALL-UNNAMED
|
|
@ -20,6 +20,7 @@ module org.eclipse.jetty.websocket.jetty.client
|
|||
{
|
||||
exports org.eclipse.jetty.websocket.client;
|
||||
|
||||
requires static org.eclipse.jetty.webapp;
|
||||
requires org.eclipse.jetty.websocket.core.client;
|
||||
requires org.eclipse.jetty.websocket.jetty.common;
|
||||
requires org.slf4j;
|
||||
|
|
|
@ -0,0 +1,49 @@
|
|||
//
|
||||
// ========================================================================
|
||||
// Copyright (c) 1995-2020 Mort Bay Consulting Pty Ltd and others.
|
||||
//
|
||||
// This program and the accompanying materials are made available under
|
||||
// the terms of the Eclipse Public License 2.0 which is available at
|
||||
// https://www.eclipse.org/legal/epl-2.0
|
||||
//
|
||||
// This Source Code may also be made available under the following
|
||||
// Secondary Licenses when the conditions for such availability set
|
||||
// forth in the Eclipse Public License, v. 2.0 are satisfied:
|
||||
// the Apache License v2.0 which is available at
|
||||
// https://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
|
||||
// ========================================================================
|
||||
//
|
||||
|
||||
package org.eclipse.jetty.websocket.client.config;
|
||||
|
||||
import org.eclipse.jetty.webapp.AbstractConfiguration;
|
||||
import org.eclipse.jetty.webapp.FragmentConfiguration;
|
||||
import org.eclipse.jetty.webapp.MetaInfConfiguration;
|
||||
import org.eclipse.jetty.webapp.WebAppConfiguration;
|
||||
import org.eclipse.jetty.webapp.WebInfConfiguration;
|
||||
import org.eclipse.jetty.webapp.WebXmlConfiguration;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* <p>Websocket Configuration</p>
|
||||
* <p>This configuration configures the WebAppContext server/system classes to
|
||||
* be able to see the {@code org.eclipse.jetty.websocket.client} package.</p>
|
||||
*/
|
||||
public class JettyWebSocketClientConfiguration extends AbstractConfiguration
|
||||
{
|
||||
private static final Logger LOG = LoggerFactory.getLogger(JettyWebSocketClientConfiguration.class);
|
||||
|
||||
public JettyWebSocketClientConfiguration()
|
||||
{
|
||||
addDependencies(WebXmlConfiguration.class, MetaInfConfiguration.class, WebInfConfiguration.class, FragmentConfiguration.class);
|
||||
addDependents("org.eclipse.jetty.annotations.AnnotationConfiguration", WebAppConfiguration.class.getName());
|
||||
|
||||
protectAndExpose("org.eclipse.jetty.websocket.api.");
|
||||
protectAndExpose("org.eclipse.jetty.websocket.client.");
|
||||
hide("org.eclipse.jetty.client.impl.");
|
||||
hide("org.eclipse.jetty.client.config.");
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
org.eclipse.jetty.websocket.client.config.JettyWebSocketClientConfiguration
|
|
@ -7,12 +7,10 @@ Enable the Jetty WebSocket API for deployed web applications.
|
|||
websocket
|
||||
|
||||
[depend]
|
||||
client
|
||||
annotations
|
||||
|
||||
[lib]
|
||||
lib/websocket/websocket-core-common-${jetty.version}.jar
|
||||
lib/websocket/websocket-core-client-${jetty.version}.jar
|
||||
lib/websocket/websocket-core-server-${jetty.version}.jar
|
||||
lib/websocket/websocket-util-${jetty.version}.jar
|
||||
lib/websocket/websocket-util-server-${jetty.version}.jar
|
||||
|
|
|
@ -18,11 +18,7 @@
|
|||
|
||||
package org.eclipse.jetty.websocket.server.config;
|
||||
|
||||
import java.util.ServiceLoader;
|
||||
|
||||
import org.eclipse.jetty.util.Loader;
|
||||
import org.eclipse.jetty.webapp.AbstractConfiguration;
|
||||
import org.eclipse.jetty.webapp.Configuration;
|
||||
import org.eclipse.jetty.webapp.FragmentConfiguration;
|
||||
import org.eclipse.jetty.webapp.MetaInfConfiguration;
|
||||
import org.eclipse.jetty.webapp.WebAppConfiguration;
|
||||
|
@ -34,12 +30,8 @@ import org.slf4j.LoggerFactory;
|
|||
/**
|
||||
* <p>Websocket Configuration</p>
|
||||
* <p>This configuration configures the WebAppContext server/system classes to
|
||||
* be able to see the org.eclipse.jetty.websocket package.
|
||||
* This class is defined in the webapp package, as it implements the {@link Configuration} interface,
|
||||
* which is unknown to the websocket package. However, the corresponding {@link ServiceLoader}
|
||||
* resource is defined in the websocket package, so that this configuration only be
|
||||
* loaded if the jetty-websocket jars are on the classpath.
|
||||
* </p>
|
||||
* be able to see the {@code org.eclipse.jetty.websocket.api}, {@code org.eclipse.jetty.websocket.server} and
|
||||
* {@code org.eclipse.jetty.websocket.util.server} packages.</p>
|
||||
*/
|
||||
public class JettyWebSocketConfiguration extends AbstractConfiguration
|
||||
{
|
||||
|
@ -48,39 +40,12 @@ public class JettyWebSocketConfiguration extends AbstractConfiguration
|
|||
public JettyWebSocketConfiguration()
|
||||
{
|
||||
addDependencies(WebXmlConfiguration.class, MetaInfConfiguration.class, WebInfConfiguration.class, FragmentConfiguration.class);
|
||||
addDependents("org.eclipse.jetty.annotations.AnnotationConfiguration", WebAppConfiguration.class.getName());
|
||||
|
||||
if (isAvailable("org.eclipse.jetty.osgi.annotations.AnnotationConfiguration"))
|
||||
addDependents("org.eclipse.jetty.osgi.annotations.AnnotationConfiguration", WebAppConfiguration.class.getName());
|
||||
else if (isAvailable("org.eclipse.jetty.annotations.AnnotationConfiguration"))
|
||||
addDependents("org.eclipse.jetty.annotations.AnnotationConfiguration", WebAppConfiguration.class.getName());
|
||||
else
|
||||
throw new RuntimeException("Unable to add AnnotationConfiguration dependent (not present in classpath)");
|
||||
|
||||
protectAndExpose(
|
||||
"org.eclipse.jetty.websocket.api.",
|
||||
"org.eclipse.jetty.websocket.server.",
|
||||
"org.eclipse.jetty.websocket.util.server."); // For WebSocketUpgradeFilter
|
||||
|
||||
hide("org.eclipse.jetty.server.internal.",
|
||||
"org.eclipse.jetty.server.config.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAvailable()
|
||||
{
|
||||
return isAvailable("org.eclipse.jetty.websocket.common.JettyWebSocketFrame");
|
||||
}
|
||||
|
||||
private boolean isAvailable(String classname)
|
||||
{
|
||||
try
|
||||
{
|
||||
return Loader.loadClass(classname) != null;
|
||||
}
|
||||
catch (Throwable e)
|
||||
{
|
||||
LOG.trace("IGNORED", e);
|
||||
return false;
|
||||
}
|
||||
protectAndExpose("org.eclipse.jetty.websocket.api.");
|
||||
protectAndExpose("org.eclipse.jetty.websocket.server.");
|
||||
protectAndExpose("org.eclipse.jetty.websocket.util.server."); // For WebSocketUpgradeFilter
|
||||
hide("org.eclipse.jetty.server.internal.");
|
||||
hide("org.eclipse.jetty.server.config.");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -47,7 +47,6 @@ import org.eclipse.jetty.websocket.api.Session;
|
|||
import org.eclipse.jetty.websocket.api.StatusCode;
|
||||
import org.eclipse.jetty.websocket.api.WebSocketListener;
|
||||
import org.eclipse.jetty.websocket.client.WebSocketClient;
|
||||
import org.junit.jupiter.api.Disabled;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.condition.DisabledOnJre;
|
||||
import org.junit.jupiter.api.condition.DisabledOnOs;
|
||||
|
@ -129,7 +128,7 @@ public class DistributionTests extends AbstractJettyHomeTest
|
|||
Path quickstartWebXml = webInf.resolve("quickstart-web.xml");
|
||||
assertTrue(Files.exists(quickstartWebXml));
|
||||
assertNotEquals(0, Files.size(quickstartWebXml));
|
||||
|
||||
|
||||
int port = distribution.freePort();
|
||||
|
||||
try (JettyHomeTester.Run run3 = distribution.start("jetty.http.port=" + port, "jetty.quickstart.mode=QUICKSTART"))
|
||||
|
@ -145,7 +144,7 @@ public class DistributionTests extends AbstractJettyHomeTest
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testSimpleWebAppWithJSP() throws Exception
|
||||
{
|
||||
|
@ -376,7 +375,6 @@ public class DistributionTests extends AbstractJettyHomeTest
|
|||
}
|
||||
}
|
||||
|
||||
@Disabled
|
||||
@ParameterizedTest
|
||||
@ValueSource(strings = {"http", "https"})
|
||||
public void testWebsocketClientInWebappProvidedByServer(String scheme) throws Exception
|
||||
|
@ -389,11 +387,12 @@ public class DistributionTests extends AbstractJettyHomeTest
|
|||
.mavenLocalRepository(System.getProperty("mavenRepoPath"))
|
||||
.build();
|
||||
|
||||
String module = "https".equals(scheme) ? "test-keystore," + scheme : scheme;
|
||||
String[] args1 = {
|
||||
"--create-startd",
|
||||
"--approve-all-licenses",
|
||||
"--add-to-start=resources,server,webapp,deploy,jsp,jmx,servlet,servlets,websocket,test-keystore," + scheme
|
||||
};
|
||||
"--add-to-start=resources,server,webapp,deploy,jsp,jmx,servlet,servlets,websocket,websocket-jetty-client," + module,
|
||||
};
|
||||
try (JettyHomeTester.Run run1 = distribution.start(args1))
|
||||
{
|
||||
assertTrue(run1.awaitFor(5, TimeUnit.SECONDS));
|
||||
|
@ -425,7 +424,6 @@ public class DistributionTests extends AbstractJettyHomeTest
|
|||
}
|
||||
}
|
||||
|
||||
@Disabled
|
||||
@ParameterizedTest
|
||||
@ValueSource(strings = {"http", "https"})
|
||||
public void testWebsocketClientInWebapp(String scheme) throws Exception
|
||||
|
@ -457,7 +455,7 @@ public class DistributionTests extends AbstractJettyHomeTest
|
|||
"jetty.http.port=" + port,
|
||||
"jetty.ssl.port=" + port,
|
||||
// "jetty.server.dumpAfterStart=true",
|
||||
};
|
||||
};
|
||||
|
||||
try (JettyHomeTester.Run run2 = distribution.start(args2))
|
||||
{
|
||||
|
@ -515,8 +513,8 @@ public class DistributionTests extends AbstractJettyHomeTest
|
|||
|
||||
/**
|
||||
* This reproduces some classloading issue with MethodHandles in JDK14-15, this has been fixed in JDK16.
|
||||
* @see <a href="https://bugs.openjdk.java.net/browse/JDK-8244090">JDK-8244090</a>
|
||||
* @throws Exception if there is an error during the test.
|
||||
* @see <a href="https://bugs.openjdk.java.net/browse/JDK-8244090">JDK-8244090</a>
|
||||
*/
|
||||
@ParameterizedTest
|
||||
@ValueSource(strings = {"", "--jpms"})
|
||||
|
@ -641,5 +639,4 @@ public class DistributionTests extends AbstractJettyHomeTest
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -13,6 +13,15 @@
|
|||
<name>Test :: Jetty Websocket Simple Webapp with WebSocketClient</name>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-slf4j-impl</artifactId>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.eclipse.jetty.toolchain</groupId>
|
||||
<artifactId>jetty-servlet-api</artifactId>
|
||||
|
|
|
@ -13,6 +13,15 @@
|
|||
<name>Test :: Jetty Websocket Simple Webapp with WebSocketClient</name>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-slf4j-impl</artifactId>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.eclipse.jetty.toolchain</groupId>
|
||||
<artifactId>jetty-servlet-api</artifactId>
|
||||
|
|
Loading…
Reference in New Issue