diff --git a/examples/embedded/pom.xml b/examples/embedded/pom.xml
index fe409025f306..fb2eed394d57 100644
--- a/examples/embedded/pom.xml
+++ b/examples/embedded/pom.xml
@@ -132,7 +132,12 @@
org.eclipse.jetty.toolchain
jetty-test-helper
-
+ test
+
+
+ org.eclipse.jetty.websocket
+ websocket-client
+ ${project.version}
org.eclipse.jetty
@@ -141,8 +146,27 @@
tests
test
+
+ org.eclipse.jetty
+ jetty-distribution
+ ${project.version}
+ tar.gz
+ test
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+ false
+
+
+
+
+
jdk9
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/AsyncEchoServlet.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/AsyncEchoServlet.java
index e225703dc2bf..7a53073e6eeb 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/AsyncEchoServlet.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/AsyncEchoServlet.java
@@ -22,7 +22,6 @@
import java.util.concurrent.atomic.AtomicBoolean;
import javax.servlet.AsyncContext;
import javax.servlet.ReadListener;
-import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
@@ -35,7 +34,7 @@ public class AsyncEchoServlet extends HttpServlet
private static final long serialVersionUID = 1L;
@Override
- protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException
{
AsyncContext asyncContext = request.startAsync(request, response);
asyncContext.setTimeout(0);
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/DumpServlet.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/DumpServlet.java
index 38372558bd84..0f21dccf7229 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/DumpServlet.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/DumpServlet.java
@@ -20,6 +20,8 @@
import java.io.IOException;
import java.io.PrintWriter;
+import java.util.Collections;
+import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -45,12 +47,28 @@ protected void doGet(HttpServletRequest request,
out.println("pathInfo=" + request.getPathInfo());
out.println("session=" + request.getSession(true).getId());
+ ServletContext servletContext = getServletContext();
+
String r = request.getParameter("resource");
if (r != null)
{
- out.println("resource(" + r + ")=" + getServletContext().getResource(r));
+ out.println("resource(" + r + ")=" + servletContext.getResource(r));
}
+ Collections.list(request.getAttributeNames())
+ .stream()
+ .filter((name) -> name.startsWith("X-"))
+ .sorted()
+ .forEach((name) ->
+ out.println("request.attribute[" + name + "]=" + request.getAttribute(name)));
+
+ Collections.list(servletContext.getAttributeNames())
+ .stream()
+ .filter((name) -> name.startsWith("X-"))
+ .sorted()
+ .forEach((name) ->
+ out.println("servletContext.attribute[" + name + "]=" + servletContext.getAttribute(name)));
+
out.println("");
}
}
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ExampleServer.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ExampleServer.java
index b4d5ac45ffff..f003bafe00a9 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ExampleServer.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ExampleServer.java
@@ -28,12 +28,12 @@
public class ExampleServer
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port)
{
Server server = new Server();
ServerConnector connector = new ServerConnector(server);
- connector.setPort(8080);
+ connector.setPort(port);
server.setConnectors(new Connector[]{connector});
ServletContextHandler context = new ServletContextHandler();
@@ -45,6 +45,13 @@ public static void main(String[] args) throws Exception
handlers.setHandlers(new Handler[]{context, new DefaultHandler()});
server.setHandler(handlers);
+ return server;
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Server server = createServer(port);
server.start();
server.join();
}
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ExampleServerXml.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ExampleServerXml.java
index e65f001967af..1ca2a34440f0 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ExampleServerXml.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ExampleServerXml.java
@@ -18,21 +18,31 @@
package org.eclipse.jetty.embedded;
+import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.xml.XmlConfiguration;
/**
* Configures and Starts a Jetty server from an XML declaration.
- *
- * See exampleserver.xml
- *
*/
public class ExampleServerXml
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port) throws Exception
{
// Find Jetty XML (in classpath) that configures and starts Server.
+ // See src/main/resources/exampleserver.xml
Resource serverXml = Resource.newSystemResource("exampleserver.xml");
- XmlConfiguration.main(serverXml.getFile().getAbsolutePath());
+ XmlConfiguration xml = new XmlConfiguration(serverXml);
+ xml.getProperties().put("http.port", Integer.toString(port));
+ Server server = (Server)xml.configure();
+ return server;
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Server server = createServer(port);
+ server.start();
+ server.join();
}
}
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ExampleUtil.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ExampleUtil.java
new file mode 100644
index 000000000000..ce4d77c8966b
--- /dev/null
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ExampleUtil.java
@@ -0,0 +1,86 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import org.eclipse.jetty.util.StringUtil;
+
+public class ExampleUtil
+{
+ /**
+ * Get a port, possibly configured from Command line or System property.
+ *
+ * @param args the command line arguments
+ * @param propertyName the property name
+ * @param defValue the default value
+ * @return the configured port
+ */
+ public static int getPort(String[] args, String propertyName, int defValue)
+ {
+ for (String arg : args)
+ {
+ if (arg.startsWith(propertyName + "="))
+ {
+ String value = arg.substring(propertyName.length() + 2);
+ int port = toInt(value);
+ if (isValidPort(port))
+ return port;
+ }
+ }
+
+ String value = System.getProperty(propertyName);
+ int port = toInt(value);
+ if (isValidPort(port))
+ return port;
+
+ return defValue;
+ }
+
+ /**
+ * Test if port is in the valid range to be used.
+ *
+ * @param port the port to test
+ * @return true if valid
+ */
+ private static boolean isValidPort(int port)
+ {
+ return (port >= 0) && (port <= 65535);
+ }
+
+ /**
+ * Parse an int, ignoring any {@link NumberFormatException}
+ *
+ * @param value the string value to parse
+ * @return the int (if parsed), or -1 if not parsed.
+ */
+ private static int toInt(String value)
+ {
+ if (StringUtil.isBlank(value))
+ return -1;
+
+ try
+ {
+ return Integer.parseInt(value);
+ }
+ catch (NumberFormatException ignored)
+ {
+ // ignored
+ return -1;
+ }
+ }
+}
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/FastFileServer.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/FastFileServer.java
index bfcc54936379..febd097151f6 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/FastFileServer.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/FastFileServer.java
@@ -58,17 +58,24 @@
*/
public class FastFileServer
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port, File resourceBase)
{
- Server server = new Server(8080);
+ Server server = new Server(port);
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[]{
- new FastFileHandler(new File(System.getProperty("user.dir"))),
+ new FastFileHandler(resourceBase),
new DefaultHandler()
});
server.setHandler(handlers);
+ return server;
+ }
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ File directory = new File(System.getProperty("user.dir"));
+ Server server = createServer(port, directory);
server.start();
server.join();
}
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/FileServer.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/FileServer.java
index 1934f2e73120..b9d6714f2ccd 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/FileServer.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/FileServer.java
@@ -18,11 +18,16 @@
package org.eclipse.jetty.embedded;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler;
+import org.eclipse.jetty.util.resource.PathResource;
+import org.eclipse.jetty.util.resource.Resource;
/**
* Simple Jetty FileServer.
@@ -30,12 +35,12 @@
*/
public class FileServer
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port, Resource baseResource) throws Exception
{
// Create a basic Jetty server object that will listen on port 8080. Note that if you set this to port 0
// then a randomly available port will be assigned that you can either look in the logs for the port,
// or programmatically obtain it for use in test cases.
- Server server = new Server(8080);
+ Server server = new Server(port);
// Create the ResourceHandler. It is the object that will actually handle the request for a given file. It is
// a Jetty Handler object so it is suitable for chaining with other handlers as you will see in other examples.
@@ -45,13 +50,24 @@ public static void main(String[] args) throws Exception
// In this example it is the current directory but it can be configured to anything that the jvm has access to.
resourceHandler.setDirectoriesListed(true);
resourceHandler.setWelcomeFiles(new String[]{"index.html"});
- resourceHandler.setResourceBase(".");
+ resourceHandler.setBaseResource(baseResource);
// Add the ResourceHandler to the server.
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[]{resourceHandler, new DefaultHandler()});
server.setHandler(handlers);
+ return server;
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Path userDir = Paths.get(System.getProperty("user.dir"));
+ PathResource pathResource = new PathResource(userDir);
+
+ Server server = createServer(port, pathResource);
+
// Start things up! By using the server.join() the server thread will join with the current thread.
// See "http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#join()" for more details.
server.start();
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/FileServerXml.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/FileServerXml.java
index 8b37cdb6fdde..73481ef4e34f 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/FileServerXml.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/FileServerXml.java
@@ -18,6 +18,9 @@
package org.eclipse.jetty.embedded;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.xml.XmlConfiguration;
@@ -28,17 +31,25 @@
* This server is identical to {@link FileServer}, except that it is configured
* via an {@link XmlConfiguration} config file that does the identical work.
*
- *
- * See fileserver.xml
- *
*/
public class FileServerXml
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port, Path baseResource) throws Exception
{
+ // Find Jetty XML (in classpath) that configures and starts Server.
+ // See src/main/resources/fileserver.xml
Resource fileServerXml = Resource.newSystemResource("fileserver.xml");
XmlConfiguration configuration = new XmlConfiguration(fileServerXml);
- Server server = (Server)configuration.configure();
+ configuration.getProperties().put("http.port", Integer.toString(port));
+ configuration.getProperties().put("fileserver.baseresource", baseResource.toAbsolutePath().toString());
+ return (Server)configuration.configure();
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Path userDir = Paths.get(System.getProperty("user.dir"));
+ Server server = createServer(port, userDir);
server.start();
server.join();
}
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/HelloWorld.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/HelloWorld.java
index 151432fe6b9b..5218c5e9249b 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/HelloWorld.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/HelloWorld.java
@@ -51,7 +51,8 @@ public void handle(String target,
public static void main(String[] args) throws Exception
{
- Server server = new Server(8080);
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Server server = new Server(port);
server.setHandler(new HelloWorld());
server.start();
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/Http2Server.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/Http2Server.java
index fa69dba7c23e..6aa321b336a5 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/Http2Server.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/Http2Server.java
@@ -18,9 +18,12 @@
package org.eclipse.jetty.embedded;
-import java.io.File;
+import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.management.ManagementFactory;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.Date;
import java.util.EnumSet;
import javax.servlet.DispatcherType;
@@ -54,6 +57,7 @@
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.servlets.PushCacheFilter;
+import org.eclipse.jetty.util.resource.PathResource;
import org.eclipse.jetty.util.ssl.SslContextFactory;
/**
@@ -63,6 +67,8 @@ public class Http2Server
{
public static void main(String... args) throws Exception
{
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ int securePort = ExampleUtil.getPort(args, "jetty.https.port", 8443);
Server server = new Server();
MBeanContainer mbContainer = new MBeanContainer(
@@ -70,10 +76,11 @@ public static void main(String... args) throws Exception
server.addBean(mbContainer);
ServletContextHandler context = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS);
- String docroot = "src/main/resources/docroot";
- if (!new File(docroot).exists())
- docroot = "examples/embedded/src/main/resources/docroot";
- context.setResourceBase(docroot);
+ Path docroot = Paths.get("src/main/resources/docroot");
+ if (!Files.exists(docroot))
+ throw new FileNotFoundException(docroot.toString());
+
+ context.setBaseResource(new PathResource(docroot));
context.addFilter(PushCacheFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
// context.addFilter(PushSessionCacheFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST));
context.addFilter(PushedTilesFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
@@ -84,21 +91,21 @@ public static void main(String... args) throws Exception
// HTTP Configuration
HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.setSecureScheme("https");
- httpConfig.setSecurePort(8443);
+ httpConfig.setSecurePort(securePort);
httpConfig.setSendXPoweredBy(true);
httpConfig.setSendServerVersion(true);
// HTTP Connector
ServerConnector http = new ServerConnector(server, new HttpConnectionFactory(httpConfig), new HTTP2CServerConnectionFactory(httpConfig));
- http.setPort(8080);
+ http.setPort(port);
server.addConnector(http);
// SSL Context Factory for HTTPS and HTTP/2
- String jettyDistro = System.getProperty("jetty.distro", "../../jetty-distribution/target/distribution");
- if (!new File(jettyDistro).exists())
- jettyDistro = "jetty-distribution/target/distribution";
+ Path keystorePath = Paths.get("src/main/resources/etc/keystore").toAbsolutePath();
+ if (!Files.exists(keystorePath))
+ throw new FileNotFoundException(keystorePath.toString());
SslContextFactory sslContextFactory = new SslContextFactory.Server();
- sslContextFactory.setKeyStorePath(jettyDistro + "/demo-base/etc/keystore");
+ sslContextFactory.setKeyStorePath(keystorePath.toString());
sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
sslContextFactory.setCipherComparator(HTTP2Cipher.COMPARATOR);
@@ -120,7 +127,7 @@ public static void main(String... args) throws Exception
// HTTP/2 Connector
ServerConnector http2Connector =
new ServerConnector(server, ssl, alpn, h2, new HttpConnectionFactory(httpsConfig));
- http2Connector.setPort(8443);
+ http2Connector.setPort(securePort);
server.addConnector(http2Connector);
ALPN.debug = false;
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/JarServer.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/JarServer.java
index 9b32d6a16cc2..027f5f922d6b 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/JarServer.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/JarServer.java
@@ -18,7 +18,11 @@
package org.eclipse.jetty.embedded;
-import org.eclipse.jetty.server.Handler;
+import java.io.FileNotFoundException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerList;
@@ -28,24 +32,36 @@
import org.eclipse.jetty.util.resource.Resource;
/**
- *
+ * Example of serving content from a JAR file.
+ * The JAR file in this example does not belong to any Classpath.
*/
public class JarServer
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port) throws Exception
{
- Server server = new Server(8080);
+ Server server = new Server(port);
+
+ Path jarFile = Paths.get("src/main/other/content.jar");
+ if (!Files.exists(jarFile))
+ throw new FileNotFoundException(jarFile.toString());
ServletContextHandler context = new ServletContextHandler();
Resource.setDefaultUseCaches(true);
- Resource base = Resource.newResource("jar:file:src/main/resources/content.jar!/");
+ Resource base = Resource.newResource("jar:" + jarFile.toAbsolutePath().toUri().toASCIIString() + "!/");
context.setBaseResource(base);
context.addServlet(new ServletHolder(new DefaultServlet()), "/");
HandlerList handlers = new HandlerList();
- handlers.setHandlers(new Handler[]{context, new DefaultHandler()});
+ handlers.addHandler(context);
+ handlers.addHandler(new DefaultHandler());
server.setHandler(handlers);
+ return server;
+ }
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Server server = createServer(port);
server.start();
server.join();
}
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/JettyDistribution.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/JettyDistribution.java
index 97118cfe32e6..f8450325c3e7 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/JettyDistribution.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/JettyDistribution.java
@@ -18,8 +18,9 @@
package org.eclipse.jetty.embedded;
-import java.io.File;
+import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.Paths;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.log.Log;
@@ -41,54 +42,80 @@ public class JettyDistribution
static
{
Path distro = asJettyDistribution(System.getProperty("jetty.home"));
+ LOG.debug("JettyDistribution(prop(jetty.home)) = " + distro);
if (distro == null)
+ {
distro = asJettyDistribution(System.getenv().get("JETTY_HOME"));
+ LOG.debug("JettyDistribution(env(JETTY_HOME)) = " + distro);
+ }
if (distro == null)
{
try
{
- Path working = new File(".").getAbsoluteFile().getCanonicalFile().toPath();
+ Path working = Paths.get(System.getProperty("user.dir"));
+ LOG.debug("JettyDistribution(prop(user.dir)) = " + working);
while (distro == null && working != null)
{
distro = asJettyDistribution(working.resolve("jetty-distribution/target/distribution").toString());
working = working.getParent();
}
+ LOG.debug("JettyDistribution(working.resolve(...)) = " + distro);
}
catch (Throwable cause)
{
LOG.warn(cause);
}
}
+
+ if (distro == null)
+ {
+ LOG.info("JettyDistribution() FAILURE: NOT FOUND");
+ }
+ else
+ {
+ LOG.debug("JettyDistribution() FOUND = " + distro);
+ }
DISTRIBUTION = distro;
}
- private static Path asJettyDistribution(String test)
+ private static Path asJettyDistribution(String jettyHome)
{
try
{
- if (StringUtil.isBlank(test))
+ if (jettyHome == null)
{
- LOG.info("asJettyDistribution {} is blank", test);
return null;
}
- File dir = new File(test);
- if (!dir.exists() || !dir.isDirectory())
+ if (StringUtil.isBlank(jettyHome))
{
- LOG.info("asJettyDistribution {} is not a directory", test);
+ LOG.debug("asJettyDistribution {} is blank", jettyHome);
return null;
}
- File demoBase = new File(dir, "demo-base");
- if (!demoBase.exists() || !demoBase.isDirectory())
+ Path dir = Paths.get(jettyHome);
+ if (!Files.exists(dir))
{
- LOG.info("asJettyDistribution {} has no demo-base", test);
+ LOG.debug("asJettyDistribution {} does not exist", jettyHome);
return null;
}
- LOG.info("asJettyDistribution {}", dir);
- return dir.getAbsoluteFile().getCanonicalFile().toPath();
+ if (!Files.isDirectory(dir))
+ {
+ LOG.debug("asJettyDistribution {} is not a directory", jettyHome);
+ return null;
+ }
+
+ Path demoBase = dir.resolve("demo-base");
+ if (!Files.exists(demoBase) || !Files.isDirectory(demoBase))
+ {
+ LOG.debug("asJettyDistribution {} has no demo-base", jettyHome);
+ return null;
+ }
+
+ LOG.debug("asJettyDistribution {}", dir);
+ return dir.toAbsolutePath();
}
catch (Exception e)
{
@@ -97,9 +124,16 @@ private static Path asJettyDistribution(String test)
return null;
}
+ public static Path get()
+ {
+ if (DISTRIBUTION == null)
+ throw new RuntimeException("jetty-distribution not found");
+ return DISTRIBUTION;
+ }
+
public static Path resolve(String path)
{
- return DISTRIBUTION.resolve(path);
+ return get().resolve(path);
}
public static void main(String... arg)
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/LikeJettyXml.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/LikeJettyXml.java
index 54a9737464c0..e051212fef3a 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/LikeJettyXml.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/LikeJettyXml.java
@@ -18,8 +18,11 @@
package org.eclipse.jetty.embedded;
-import java.io.File;
+import java.io.FileNotFoundException;
import java.lang.management.ManagementFactory;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import org.eclipse.jetty.deploy.DeploymentManager;
import org.eclipse.jetty.deploy.PropertiesConfigurationManager;
@@ -58,21 +61,21 @@
*/
public class LikeJettyXml
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port, int securePort, boolean addDebugListener) throws Exception
{
// Path to as-built jetty-distribution directory
- String jettyHomeBuild = JettyDistribution.DISTRIBUTION.toString();
+ Path jettyHomeBuild = JettyDistribution.get();
// Find jetty home and base directories
- String homePath = System.getProperty("jetty.home", jettyHomeBuild);
- File homeDir = new File(homePath);
+ String homePath = System.getProperty("jetty.home", jettyHomeBuild.toString());
+ Path homeDir = Paths.get(homePath);
- String basePath = System.getProperty("jetty.base", homeDir + "/demo-base");
- File baseDir = new File(basePath);
+ String basePath = System.getProperty("jetty.base", homeDir.resolve("demo-base").toString());
+ Path baseDir = Paths.get(basePath);
// Configure jetty.home and jetty.base system properties
- String jettyHome = homeDir.getAbsolutePath();
- String jettyBase = baseDir.getAbsolutePath();
+ String jettyHome = homeDir.toAbsolutePath().toString();
+ String jettyBase = baseDir.toAbsolutePath().toString();
System.setProperty("jetty.home", jettyHome);
System.setProperty("jetty.base", jettyBase);
@@ -90,7 +93,7 @@ public static void main(String[] args) throws Exception
// HTTP Configuration
HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.setSecureScheme("https");
- httpConfig.setSecurePort(8443);
+ httpConfig.setSecurePort(securePort);
httpConfig.setOutputBufferSize(32768);
httpConfig.setRequestHeaderSize(8192);
httpConfig.setResponseHeaderSize(8192);
@@ -104,11 +107,6 @@ public static void main(String[] args) throws Exception
handlers.setHandlers(new Handler[]{contexts, new DefaultHandler()});
server.setHandler(handlers);
- // Extra options
- server.setDumpAfterStart(true);
- server.setDumpBeforeStop(false);
- server.setStopAtShutdown(true);
-
// === jetty-jmx.xml ===
MBeanContainer mbContainer = new MBeanContainer(
ManagementFactory.getPlatformMBeanServer());
@@ -117,24 +115,21 @@ public static void main(String[] args) throws Exception
// === jetty-http.xml ===
ServerConnector http = new ServerConnector(server,
new HttpConnectionFactory(httpConfig));
- http.setPort(8080);
+ http.setPort(port);
http.setIdleTimeout(30000);
server.addConnector(http);
// === jetty-https.xml ===
// SSL Context Factory
+ Path keystorePath = Paths.get("src/main/resources/etc/keystore").toAbsolutePath();
+ if (!Files.exists(keystorePath))
+ throw new FileNotFoundException(keystorePath.toString());
SslContextFactory sslContextFactory = new SslContextFactory.Server();
- sslContextFactory.setKeyStorePath(jettyHome + "/../../../jetty-server/src/test/config/etc/keystore");
+ sslContextFactory.setKeyStorePath(keystorePath.toString());
sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
- sslContextFactory.setTrustStorePath(jettyHome + "/../../../jetty-server/src/test/config/etc/keystore");
+ sslContextFactory.setTrustStorePath(keystorePath.toString());
sslContextFactory.setTrustStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
- sslContextFactory.setExcludeCipherSuites("SSL_RSA_WITH_DES_CBC_SHA",
- "SSL_DHE_RSA_WITH_DES_CBC_SHA", "SSL_DHE_DSS_WITH_DES_CBC_SHA",
- "SSL_RSA_EXPORT_WITH_RC4_40_MD5",
- "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
- "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
- "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA");
// SSL HTTP Configuration
HttpConfiguration httpsConfig = new HttpConfiguration(httpConfig);
@@ -144,14 +139,17 @@ public static void main(String[] args) throws Exception
ServerConnector sslConnector = new ServerConnector(server,
new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
new HttpConnectionFactory(httpsConfig));
- sslConnector.setPort(8443);
+ sslConnector.setPort(securePort);
server.addConnector(sslConnector);
// === jetty-deploy.xml ===
DeploymentManager deployer = new DeploymentManager();
- DebugListener debug = new DebugListener(System.err, true, true, true);
- server.addBean(debug);
- deployer.addLifeCycleBinding(new DebugListenerBinding(debug));
+ if (addDebugListener)
+ {
+ DebugListener debug = new DebugListener(System.err, true, true, true);
+ server.addBean(debug);
+ deployer.addLifeCycleBinding(new DebugListenerBinding(debug));
+ }
deployer.setContexts(contexts);
deployer.setContextAttribute(
"org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
@@ -215,6 +213,20 @@ public static void main(String[] args) throws Exception
login.setHotReload(false);
server.addBean(login);
+ return server;
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ int securePort = ExampleUtil.getPort(args, "jetty.https.port", 8443);
+ Server server = createServer(port, securePort, true);
+
+ // Extra options
+ server.setDumpAfterStart(true);
+ server.setDumpBeforeStop(false);
+ server.setStopAtShutdown(true);
+
// Start the server
server.start();
server.join();
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyConnectors.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyConnectors.java
index 13b41236678a..27a9e714f2df 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyConnectors.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyConnectors.java
@@ -18,8 +18,10 @@
package org.eclipse.jetty.embedded;
-import java.io.File;
import java.io.FileNotFoundException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.server.Connector;
@@ -36,23 +38,13 @@
*/
public class ManyConnectors
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int plainPort, int securePort) throws Exception
{
// Since this example shows off SSL configuration, we need a keystore
- // with the appropriate key. These lookup of jetty.home is purely a hack
- // to get access to a keystore that we use in many unit tests and should
- // probably be a direct path to your own keystore.
-
- String jettyDistKeystore = "../../jetty-distribution/target/distribution/demo-base/etc/keystore";
- String keystorePath = System.getProperty("example.keystore", jettyDistKeystore);
- File keystoreFile = new File(keystorePath);
- if (!keystoreFile.exists())
- {
- keystorePath = "jetty-distribution/target/distribution/demo-base/etc/keystore";
- keystoreFile = new File(keystorePath);
- if (!keystoreFile.exists())
- throw new FileNotFoundException(keystoreFile.getAbsolutePath());
- }
+ // with the appropriate key.
+ Path keystorePath = Paths.get("src/main/resources/etc/keystore").toAbsolutePath();
+ if (!Files.exists(keystorePath))
+ throw new FileNotFoundException(keystorePath.toString());
// Create a basic jetty server object without declaring the port. Since
// we are configuring connectors directly we'll be setting ports on
@@ -67,7 +59,7 @@ public static void main(String[] args) throws Exception
// done. The port for secured communication is also set here.
HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.setSecureScheme("https");
- httpConfig.setSecurePort(8443);
+ httpConfig.setSecurePort(securePort);
httpConfig.setOutputBufferSize(32768);
// HTTP connector
@@ -77,7 +69,7 @@ public static void main(String[] args) throws Exception
// configure an idle timeout.
ServerConnector http = new ServerConnector(server,
new HttpConnectionFactory(httpConfig));
- http.setPort(8080);
+ http.setPort(plainPort);
http.setIdleTimeout(30000);
// SSL Context Factory for HTTPS
@@ -88,7 +80,7 @@ public static void main(String[] args) throws Exception
// keystore to be used.
SslContextFactory sslContextFactory = new SslContextFactory.Server();
- sslContextFactory.setKeyStorePath(keystoreFile.getAbsolutePath());
+ sslContextFactory.setKeyStorePath(keystorePath.toString());
sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
@@ -118,7 +110,7 @@ public static void main(String[] args) throws Exception
ServerConnector https = new ServerConnector(server,
new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
new HttpConnectionFactory(httpsConfig));
- https.setPort(8443);
+ https.setPort(securePort);
https.setIdleTimeout(500000);
// Here you see the server having multiple connectors registered with
@@ -132,7 +124,14 @@ public static void main(String[] args) throws Exception
// Set a handler
server.setHandler(new HelloHandler());
+ return server;
+ }
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ int securePort = ExampleUtil.getPort(args, "jetty.https.port", 8443);
+ Server server = createServer(port, securePort);
// Start the server
server.start();
server.dumpStdErr();
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyContexts.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyContexts.java
index dc1f10985f5e..d64735e964f8 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyContexts.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyContexts.java
@@ -18,39 +18,42 @@
package org.eclipse.jetty.embedded;
-import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
public class ManyContexts
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port)
{
- Server server = new Server(8080);
+ Server server = new Server(port);
ContextHandler context = new ContextHandler("/");
context.setContextPath("/");
context.setHandler(new HelloHandler("Root Hello"));
ContextHandler contextFR = new ContextHandler("/fr");
- contextFR.setHandler(new HelloHandler("Bonjoir"));
+ contextFR.setHandler(new HelloHandler("Bonjour"));
ContextHandler contextIT = new ContextHandler("/it");
- contextIT.setHandler(new HelloHandler("Bongiorno"));
+ contextIT.setHandler(new HelloHandler("Buongiorno"));
ContextHandler contextV = new ContextHandler("/");
contextV.setVirtualHosts(new String[]{"127.0.0.2"});
contextV.setHandler(new HelloHandler("Virtual Hello"));
- ContextHandlerCollection contexts = new ContextHandlerCollection();
- contexts.setHandlers(new Handler[]{
- context, contextFR, contextIT,
- contextV
- });
+ ContextHandlerCollection contexts = new ContextHandlerCollection(
+ context, contextFR, contextIT, contextV
+ );
server.setHandler(contexts);
+ return server;
+ }
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Server server = createServer(port);
server.start();
server.dumpStdErr();
server.join();
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyHandlers.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyHandlers.java
index 49bc494302f7..e6dfce9a1b97 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyHandlers.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyHandlers.java
@@ -30,6 +30,8 @@
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.AbstractHandler;
+import org.eclipse.jetty.server.handler.ContextHandler;
+import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.server.handler.HandlerList;
@@ -99,20 +101,23 @@ public void handle(String target,
HttpServletResponse response) throws IOException,
ServletException
{
- request.setAttribute("welcome", "Hello");
+ response.setHeader("X-Welcome", "Greetings from WelcomeWrapHandler");
super.handle(target, baseRequest, request, response);
}
}
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port) throws IOException
{
- Server server = new Server(8080);
+ Server server = new Server(port);
// create the handlers
Handler param = new ParamHandler();
HandlerWrapper wrapper = new WelcomeWrapHandler();
Handler hello = new HelloHandler();
- Handler dft = new DefaultHandler();
+ GzipHandler gzipHandler = new GzipHandler();
+ gzipHandler.setMinGzipSize(10);
+ gzipHandler.addIncludedMimeTypes("text/plain");
+ gzipHandler.addIncludedMimeTypes("text/html");
// configure request logging
File requestLogFile = File.createTempFile("demo", "log");
@@ -120,16 +125,47 @@ public static void main(String[] args) throws Exception
server.setRequestLog(ncsaLog);
// create the handler collections
- HandlerCollection handlers = new HandlerCollection();
- HandlerList list = new HandlerList();
+ HandlerList handlers = new HandlerList();
- // link them all together
+ // wrap contexts around specific handlers
wrapper.setHandler(hello);
- list.setHandlers(new Handler[]{param, new GzipHandler()});
- handlers.setHandlers(new Handler[]{list, dft});
+ ContextHandler helloContext = new ContextHandler("/hello");
+ helloContext.setHandler(wrapper);
+
+ ContextHandler paramContext = new ContextHandler("/params");
+ paramContext.setHandler(param);
+
+ ContextHandlerCollection contexts = new ContextHandlerCollection(helloContext, paramContext);
+ // Wrap Contexts with GZIP
+ gzipHandler.setHandler(contexts);
+
+ // Set the top level Handler List
+ handlers.addHandler(gzipHandler);
+ handlers.addHandler(new DefaultHandler());
server.setHandler(handlers);
+ /* At this point you have the following handler hierarchy.
+ *
+ * Server.handler:
+ * HandlerList
+ * \- GzipHandler
+ * | \- ContextHandlerCollection
+ * | \- ContextHandler ("/hello")
+ * | | \- WelcomeWrapHandler
+ * | | \- HelloHandler
+ * | \- ContextHandler ("/params")
+ * | \- ParamHandler
+ * \- DefaultHandler
+ */
+
+ return server;
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Server server = createServer(port);
server.start();
server.join();
}
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyServletContexts.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyServletContexts.java
index 53fa7317c041..d1adc4be4c3b 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyServletContexts.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyServletContexts.java
@@ -29,9 +29,9 @@
public class ManyServletContexts
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port)
{
- Server server = new Server(8080);
+ Server server = new Server(port);
// Setup JMX
MBeanContainer mbContainer = new MBeanContainer(
@@ -48,7 +48,7 @@ public static void main(String[] args) throws Exception
// Add servlets to root context
root.addServlet(new ServletHolder(new HelloServlet("Hello")), "/");
root.addServlet(new ServletHolder(new HelloServlet("Ciao")), "/it/*");
- root.addServlet(new ServletHolder(new HelloServlet("Bonjoir")), "/fr/*");
+ root.addServlet(new ServletHolder(new HelloServlet("Bonjour")), "/fr/*");
// Configure context "/other" for servlets
ServletContextHandler other = new ServletContextHandler(contexts,
@@ -57,6 +57,13 @@ public static void main(String[] args) throws Exception
other.addServlet(DefaultServlet.class.getCanonicalName(), "/");
other.addServlet(new ServletHolder(new HelloServlet("YO!")), "*.yo");
+ return server;
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Server server = createServer(port);
server.start();
server.dumpStdErr();
server.join();
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/MinimalServlets.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/MinimalServlets.java
index 5ce9a24016c7..76a9fe82cda0 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/MinimalServlets.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/MinimalServlets.java
@@ -19,7 +19,6 @@
package org.eclipse.jetty.embedded;
import java.io.IOException;
-import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -29,13 +28,13 @@
public class MinimalServlets
{
- public static void main(String[] args) throws Exception
+
+ public static Server createServer(int port)
{
- // Create a basic jetty server object that will listen on port 8080.
// Note that if you set this to port 0 then a randomly available port
// will be assigned that you can either look in the logs for the port,
// or programmatically obtain it for use in test cases.
- Server server = new Server(8080);
+ Server server = new Server(port);
// The ServletHandler is a dead simple way to create a context handler
// that is backed by an instance of a Servlet.
@@ -51,13 +50,20 @@ public static void main(String[] args) throws Exception
// through a web.xml @WebServlet annotation, or anything similar.
handler.addServletWithMapping(HelloServlet.class, "/*");
+ return server;
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ // Create a basic jetty server object that will listen on port 8080.
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Server server = createServer(port);
+
// Start things up!
server.start();
// The use of server.join() the will make the current thread join and
- // wait until the server is done executing.
- // See
- // http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()
+ // wait until the server thread is done executing.
server.join();
}
@@ -66,11 +72,11 @@ public static class HelloServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest request,
- HttpServletResponse response) throws ServletException,
- IOException
+ HttpServletResponse response) throws IOException
{
- response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK);
+ response.setContentType("text/html");
+ response.setCharacterEncoding("utf-8");
response.getWriter().println("Hello from HelloServlet
");
}
}
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneConnector.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneConnector.java
index c6debe8a23b0..6e183117536a 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneConnector.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneConnector.java
@@ -26,7 +26,7 @@
*/
public class OneConnector
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port) throws Exception
{
// The Server
Server server = new Server();
@@ -34,7 +34,7 @@ public static void main(String[] args) throws Exception
// HTTP connector
ServerConnector http = new ServerConnector(server);
http.setHost("localhost");
- http.setPort(8080);
+ http.setPort(port);
http.setIdleTimeout(30000);
// Set the connector
@@ -42,6 +42,13 @@ public static void main(String[] args) throws Exception
// Set a handler
server.setHandler(new HelloHandler());
+ return server;
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Server server = createServer(port);
// Start the server
server.start();
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneContext.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneContext.java
index 1331e6abb55e..c27556f0f1e4 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneContext.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneContext.java
@@ -23,9 +23,9 @@
public class OneContext
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port)
{
- Server server = new Server(8080);
+ Server server = new Server(port);
// Add a single handler on context "/hello"
ContextHandler context = new ContextHandler();
@@ -35,6 +35,13 @@ public static void main(String[] args) throws Exception
// Can be accessed using http://localhost:8080/hello
server.setHandler(context);
+ return server;
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Server server = createServer(port);
// Start the server
server.start();
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneHandler.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneHandler.java
index b9a2f942f751..10df55d687d8 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneHandler.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneHandler.java
@@ -22,11 +22,17 @@
public class OneHandler
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port)
{
- Server server = new Server(8080);
+ Server server = new Server(port);
server.setHandler(new HelloHandler());
+ return server;
+ }
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Server server = createServer(port);
server.start();
server.join();
}
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneServletContext.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneServletContext.java
index 720309dd9175..aa468d089cb1 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneServletContext.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneServletContext.java
@@ -19,8 +19,9 @@
package org.eclipse.jetty.embedded;
import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.EnumSet;
-import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
@@ -31,38 +32,59 @@
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ListenerHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.util.resource.PathResource;
+import org.eclipse.jetty.util.resource.Resource;
+
+import static javax.servlet.DispatcherType.ASYNC;
+import static javax.servlet.DispatcherType.REQUEST;
public class OneServletContext
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port, Resource baseResource)
{
- Server server = new Server(8080);
+ Server server = new Server(port);
- ServletContextHandler context = new ServletContextHandler(
- ServletContextHandler.SESSIONS);
+ ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
- context.setResourceBase(System.getProperty("java.io.tmpdir"));
+ context.setBaseResource(baseResource);
server.setHandler(context);
- // Add dump servlet
- context.addServlet(
- context.addServlet(DumpServlet.class, "/dump/*"),
- "*.dump");
+ // add hello servlet
context.addServlet(HelloServlet.class, "/hello/*");
+
+ // Add dump servlet on multiple url-patterns
+ ServletHolder debugHolder = new ServletHolder("debug", DumpServlet.class);
+ context.addServlet(debugHolder, "/dump/*");
+ context.addServlet(debugHolder, "*.dump");
+
+ // add default servlet (for error handling and static resources)
context.addServlet(DefaultServlet.class, "/");
- context.addFilter(TestFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
- context.addFilter(TestFilter.class, "/test", EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC));
- context.addFilter(TestFilter.class, "*.test", EnumSet.of(DispatcherType.REQUEST, DispatcherType.INCLUDE, DispatcherType.FORWARD));
+ // sprinkle in a few filters to demonstrate behaviors
+ context.addFilter(TestFilter.class, "/test/*", EnumSet.of(REQUEST));
+ context.addFilter(TestFilter.class, "*.test", EnumSet.of(REQUEST, ASYNC));
+ // and a few listeners to show other ways of working with servlets
context.getServletHandler().addListener(new ListenerHolder(InitListener.class));
context.getServletHandler().addListener(new ListenerHolder(RequestListener.class));
+ return server;
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Path tempDir = Paths.get(System.getProperty("java.io.tmpdir"));
+
+ Server server = createServer(port, new PathResource(tempDir));
+
server.start();
server.dumpStdErr();
server.join();
@@ -71,14 +93,18 @@ public static void main(String[] args) throws Exception
public static class TestFilter implements Filter
{
@Override
- public void init(FilterConfig filterConfig) throws ServletException
+ public void init(FilterConfig filterConfig)
{
-
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
+ if (response instanceof HttpServletResponse)
+ {
+ HttpServletResponse httpServletResponse = (HttpServletResponse)response;
+ httpServletResponse.setHeader("X-TestFilter", "true");
+ }
chain.doFilter(request, response);
}
@@ -94,6 +120,7 @@ public static class InitListener implements ServletContextListener
@Override
public void contextInitialized(ServletContextEvent sce)
{
+ sce.getServletContext().setAttribute("X-Init", "true");
}
@Override
@@ -105,15 +132,14 @@ public void contextDestroyed(ServletContextEvent sce)
public static class RequestListener implements ServletRequestListener
{
@Override
- public void requestDestroyed(ServletRequestEvent sre)
+ public void requestInitialized(ServletRequestEvent sre)
{
-
+ sre.getServletRequest().setAttribute("X-ReqListener", "true");
}
@Override
- public void requestInitialized(ServletRequestEvent sre)
+ public void requestDestroyed(ServletRequestEvent sre)
{
-
}
}
}
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneServletContextJmxStats.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneServletContextJmxStats.java
index 557c4588b657..9a33e10ea695 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneServletContextJmxStats.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneServletContextJmxStats.java
@@ -28,9 +28,10 @@
public class OneServletContextJmxStats
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port)
{
- Server server = new Server(8080);
+ Server server = new Server(port);
+
// Add JMX tracking to Server
server.addBean(new MBeanContainer(ManagementFactory
.getPlatformMBeanServer()));
@@ -45,6 +46,13 @@ public static void main(String[] args) throws Exception
// Add Connector Statistics tracking to all connectors
ServerConnectionStatistics.addToAllConnectors(server);
+ return server;
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Server server = createServer(port);
server.start();
server.join();
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneServletContextWithSession.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneServletContextWithSession.java
index 35d18c2d848c..992bfec14eac 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneServletContextWithSession.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneServletContextWithSession.java
@@ -18,24 +18,29 @@
package org.eclipse.jetty.embedded;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.session.DefaultSessionCache;
import org.eclipse.jetty.server.session.NullSessionDataStore;
import org.eclipse.jetty.server.session.SessionCache;
import org.eclipse.jetty.server.session.SessionHandler;
import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.util.resource.PathResource;
+import org.eclipse.jetty.util.resource.Resource;
public class OneServletContextWithSession
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port, Resource baseResource)
{
- Server server = new Server(8080);
+ Server server = new Server(port);
// Create a ServletContext, with a session handler enabled.
ServletContextHandler context = new ServletContextHandler(
ServletContextHandler.SESSIONS);
context.setContextPath("/");
- context.setResourceBase(System.getProperty("java.io.tmpdir"));
+ context.setBaseResource(baseResource);
server.setHandler(context);
// Access the SessionHandler from the context.
@@ -55,6 +60,15 @@ public static void main(String[] args) throws Exception
// Servlet to read/set the greeting stored in the session.
// Can be accessed using http://localhost:8080/hello
context.addServlet(HelloSessionServlet.class, "/");
+ return server;
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Path dir = Paths.get(System.getProperty("user.dir"));
+ PathResource baseResource = new PathResource(dir);
+ Server server = createServer(port, baseResource);
server.start();
server.dumpStdErr();
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneWebApp.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneWebApp.java
index 720bdaa34944..46d5b70ce086 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneWebApp.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneWebApp.java
@@ -19,26 +19,19 @@
package org.eclipse.jetty.embedded;
import java.io.File;
-import java.lang.management.ManagementFactory;
-import org.eclipse.jetty.jmx.MBeanContainer;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.WebAppContext;
public class OneWebApp
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port)
{
// Create a basic jetty server object that will listen on port 8080.
// Note that if you set this to port 0 then a randomly available port
// will be assigned that you can either look in the logs for the port,
// or programmatically obtain it for use in test cases.
- Server server = new Server(8080);
-
- // Setup JMX
- MBeanContainer mbContainer = new MBeanContainer(
- ManagementFactory.getPlatformMBeanServer());
- server.addBean(mbContainer);
+ Server server = new Server(port);
// The WebAppContext is the entity that controls the environment in
// which a web application lives and breathes. In this example the
@@ -55,6 +48,13 @@ public static void main(String[] args) throws Exception
// A WebAppContext is a ContextHandler as well so it needs to be set to
// the server so it is aware of where to send the appropriate requests.
server.setHandler(webapp);
+ return server;
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Server server = createServer(port);
// Start things up!
server.start();
@@ -63,7 +63,6 @@ public static void main(String[] args) throws Exception
// The use of server.join() the will make the current thread join and
// wait until the server is done executing.
- // See http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()
server.join();
}
}
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneWebAppWithJsp.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneWebAppWithJsp.java
index bb9348e62ca9..87175b015a88 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneWebAppWithJsp.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneWebAppWithJsp.java
@@ -18,49 +18,45 @@
package org.eclipse.jetty.embedded;
-import java.io.File;
-import java.lang.management.ManagementFactory;
+import java.io.FileNotFoundException;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
-import org.eclipse.jetty.jmx.MBeanContainer;
import org.eclipse.jetty.security.HashLoginService;
import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.util.resource.PathResource;
import org.eclipse.jetty.webapp.Configuration;
import org.eclipse.jetty.webapp.WebAppContext;
public class OneWebAppWithJsp
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port) throws FileNotFoundException
{
// Create a basic jetty server object that will listen on port 8080.
// Note that if you set this to port 0 then
// a randomly available port will be assigned that you can either look
// in the logs for the port,
// or programmatically obtain it for use in test cases.
- Server server = new Server(8080);
-
- // Setup JMX
- MBeanContainer mbContainer = new MBeanContainer(
- ManagementFactory.getPlatformMBeanServer());
- server.addBean(mbContainer);
+ Server server = new Server(port);
// The WebAppContext is the entity that controls the environment in
- // which a web application lives and
- // breathes. In this example the context path is being set to "/" so it
+ // which a web application lives and breathes.
+ // In this example the context path is being set to "/" so it
// is suitable for serving root context
- // requests and then we see it setting the location of the war. A whole
- // host of other configurations are
+ // requests and then we see it setting the location of the war.
+ // A whole host of other configurations are
// available, ranging from configuring to support annotation scanning in
- // the webapp (through
- // PlusConfiguration) to choosing where the webapp will unpack itself.
+ // the webapp (through PlusConfiguration), to choosing where
+ // the webapp will unpack itself.
WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/");
- File warFile = new File(
- "jetty-distribution/target/distribution/demo-base/webapps/test.war");
- if (!warFile.exists())
+ Path warFile = JettyDistribution.resolve("demo-base/webapps/test.war");
+ if (!Files.exists(warFile))
{
- throw new RuntimeException("Unable to find WAR File: " + warFile.getAbsolutePath());
+ throw new FileNotFoundException(warFile.toString());
}
- webapp.setWar(warFile.getAbsolutePath());
+ webapp.setWarResource(new PathResource(warFile));
webapp.setExtractWAR(true);
// This webapp will use jsps and jstl. We need to enable the
@@ -93,11 +89,25 @@ public static void main(String[] args) throws Exception
// its own we register it as a bean with the Jetty server object so it
// can be started and stopped according to the lifecycle of the server
// itself.
+ String realmResourceName = "etc/realm.properties";
+ ClassLoader classLoader = OneWebAppWithJsp.class.getClassLoader();
+ URL realmProps = classLoader.getResource(realmResourceName);
+ if (realmProps == null)
+ throw new FileNotFoundException("Unable to find " + realmResourceName);
+
HashLoginService loginService = new HashLoginService();
loginService.setName("Test Realm");
- loginService.setConfig("examples/embedded/src/test/resources/realm.properties");
+ loginService.setConfig(realmProps.toExternalForm());
server.addBean(loginService);
+ return server;
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Server server = createServer(port);
+
// Start things up!
server.start();
@@ -105,7 +115,6 @@ public static void main(String[] args) throws Exception
// The use of server.join() the will make the current thread join and
// wait until the server is done executing.
- // See http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()
server.join();
}
}
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ProxyServer.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ProxyServer.java
index ff3412f6cb32..872c57f102b8 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ProxyServer.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ProxyServer.java
@@ -27,11 +27,13 @@
public class ProxyServer
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port)
{
Server server = new Server();
+
+ // Establish listening connector
ServerConnector connector = new ServerConnector(server);
- connector.setPort(8888);
+ connector.setPort(port);
server.addConnector(connector);
// Setup proxy handler to handle CONNECT methods
@@ -45,6 +47,15 @@ public static void main(String[] args) throws Exception
proxyServlet.setInitParameter("blackList", "www.eclipse.org");
context.addServlet(proxyServlet, "/*");
+ return server;
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Server server = createServer(port);
+
server.start();
+ server.join();
}
}
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/RewriteServer.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/RewriteServer.java
index a74427f0ffdc..0347886b29b5 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/RewriteServer.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/RewriteServer.java
@@ -18,27 +18,29 @@
package org.eclipse.jetty.embedded;
+import java.util.Arrays;
+
import org.eclipse.jetty.rewrite.RewriteCustomizer;
import org.eclipse.jetty.rewrite.handler.CompactPathRule;
import org.eclipse.jetty.rewrite.handler.RewriteRegexRule;
-import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
public class RewriteServer
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port)
{
- Server server = new Server(8080);
-
- HttpConfiguration config = server.getConnectors()[0].getConnectionFactory(HttpConnectionFactory.class).getHttpConfiguration();
+ Server server = new Server(port);
RewriteCustomizer rewrite = new RewriteCustomizer();
- config.addCustomizer(rewrite);
rewrite.addRule(new CompactPathRule());
rewrite.addRule(new RewriteRegexRule("(.*)foo(.*)", "$1FOO$2"));
+ Arrays.stream(server.getConnectors())
+ .forEach((connector) -> connector.getConnectionFactory(HttpConnectionFactory.class)
+ .getHttpConfiguration().addCustomizer(rewrite));
+
ServletContextHandler context = new ServletContextHandler(
ServletContextHandler.SESSIONS);
context.setContextPath("/");
@@ -46,6 +48,14 @@ public static void main(String[] args) throws Exception
context.addServlet(DumpServlet.class, "/*");
+ return server;
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Server server = createServer(port);
+
server.start();
server.join();
}
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/SecuredHelloHandler.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/SecuredHelloHandler.java
index aaa0c806a5ed..1f339b33fa26 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/SecuredHelloHandler.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/SecuredHelloHandler.java
@@ -18,6 +18,8 @@
package org.eclipse.jetty.embedded;
+import java.io.FileNotFoundException;
+import java.net.URL;
import java.util.Collections;
import org.eclipse.jetty.security.ConstraintMapping;
@@ -30,13 +32,13 @@
public class SecuredHelloHandler
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port) throws FileNotFoundException
{
// Create a basic jetty server object that will listen on port 8080.
// Note that if you set this to port 0 then a randomly available port
// will be assigned that you can either look in the logs for the port,
// or programmatically obtain it for use in test cases.
- Server server = new Server(8080);
+ Server server = new Server(port);
// Since this example is for our test webapp, we need to setup a
// LoginService so this shows how to create a very simple hashmap based
@@ -46,8 +48,14 @@ public static void main(String[] args) throws Exception
// started and stopped according to the lifecycle of the server itself.
// In this example the name can be whatever you like since we are not
// dealing with webapp realms.
+ String realmResourceName = "etc/realm.properties";
+ ClassLoader classLoader = SecuredHelloHandler.class.getClassLoader();
+ URL realmProps = classLoader.getResource(realmResourceName);
+ if (realmProps == null)
+ throw new FileNotFoundException("Unable to find " + realmResourceName);
+
LoginService loginService = new HashLoginService("MyRealm",
- "src/test/resources/realm.properties");
+ realmProps.toExternalForm());
server.addBean(loginService);
// A security handler is a jetty handler that secures content behind a
@@ -68,7 +76,7 @@ public static void main(String[] args) throws Exception
constraint.setRoles(new String[]{"user", "admin"});
// Binds a url pattern with the previously created constraint. The roles
- // for this constraing mapping are mined from the Constraint itself
+ // for this constraint mapping are mined from the Constraint itself
// although methods exist to declare and bind roles separately as well.
ConstraintMapping mapping = new ConstraintMapping();
mapping.setPathSpec("/*");
@@ -92,13 +100,19 @@ public static void main(String[] args) throws Exception
// chain the hello handler into the security handler
security.setHandler(hh);
+ return server;
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Server server = createServer(port);
+
// Start things up!
server.start();
// The use of server.join() the will make the current thread join and
// wait until the server is done executing.
- // See
- // http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()
server.join();
}
}
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ServerWithAnnotations.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ServerWithAnnotations.java
index 42dda96c7a0a..e7a71deecf0e 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ServerWithAnnotations.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ServerWithAnnotations.java
@@ -19,6 +19,9 @@
package org.eclipse.jetty.embedded;
import java.io.File;
+import java.io.FileNotFoundException;
+import java.net.URL;
+import javax.naming.NamingException;
import org.eclipse.jetty.plus.jndi.EnvEntry;
import org.eclipse.jetty.plus.jndi.NamingDump;
@@ -34,10 +37,10 @@
*/
public class ServerWithAnnotations
{
- public static final void main(String[] args) throws Exception
+ public static Server createServer(int port) throws NamingException, FileNotFoundException
{
// Create the server
- Server server = new Server(8080);
+ Server server = new Server(port);
// Enable parsing of jndi-related parts of web.xml and jetty-env.xml
Configuration.ClassList classlist = Configuration.ClassList
@@ -63,7 +66,7 @@ public static final void main(String[] args) throws Exception
new Transaction(new com.acme.MockUserTransaction());
// Define an env entry with webapp scope.
- // THIS ENTRY IS OVERRIDEN BY THE ENTRY IN jetty-env.xml
+ // THIS ENTRY IS OVERRIDDEN BY THE ENTRY IN jetty-env.xml
new EnvEntry(webapp, "maxAmount", 100d, true);
// Register a mock DataSource scoped to the webapp
@@ -73,10 +76,23 @@ public static final void main(String[] args) throws Exception
server.addBean(new NamingDump());
// Configure a LoginService
+ String realmResourceName = "etc/realm.properties";
+ ClassLoader classLoader = ServerWithAnnotations.class.getClassLoader();
+ URL realmProps = classLoader.getResource(realmResourceName);
+ if (realmProps == null)
+ throw new FileNotFoundException("Unable to find " + realmResourceName);
+
HashLoginService loginService = new HashLoginService();
loginService.setName("Test Realm");
- loginService.setConfig("examples/embedded/src/test/resources/realm.properties");
+ loginService.setConfig(realmProps.toExternalForm());
server.addBean(loginService);
+ return server;
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Server server = createServer(port);
server.start();
server.dumpStdErr();
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ServerWithJMX.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ServerWithJMX.java
index 95b38e56a185..c3c14df0b490 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ServerWithJMX.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ServerWithJMX.java
@@ -19,6 +19,7 @@
package org.eclipse.jetty.embedded;
import java.lang.management.ManagementFactory;
+import java.net.MalformedURLException;
import javax.management.remote.JMXServiceURL;
import org.eclipse.jetty.jmx.ConnectorServer;
@@ -26,17 +27,16 @@
import org.eclipse.jetty.server.Server;
/**
- * The simplest possible Jetty server.
+ * A Jetty Server with JMX enabled for remote connections
*/
public class ServerWithJMX
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port) throws MalformedURLException
{
- // === jetty-jmx.xml ===
+ Server server = new Server(port);
+
MBeanContainer mbContainer = new MBeanContainer(
ManagementFactory.getPlatformMBeanServer());
-
- Server server = new Server(8080);
server.addBean(mbContainer);
ConnectorServer jmx = new ConnectorServer(
@@ -48,6 +48,14 @@ public static void main(String[] args) throws Exception
"org.eclipse.jetty.jmx:name=rmiconnectorserver");
server.addBean(jmx);
+ return server;
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Server server = createServer(port);
+
server.start();
server.dumpStdErr();
server.join();
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ServerWithJNDI.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ServerWithJNDI.java
index 59ec7075115d..b364700b95d4 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ServerWithJNDI.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ServerWithJNDI.java
@@ -18,10 +18,12 @@
package org.eclipse.jetty.embedded;
-import java.io.File;
+import java.nio.file.Path;
import java.util.Properties;
+import javax.naming.NamingException;
import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.util.resource.PathResource;
import org.eclipse.jetty.webapp.Configuration;
import org.eclipse.jetty.webapp.WebAppContext;
@@ -30,11 +32,10 @@
*/
public class ServerWithJNDI
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port) throws NamingException
{
-
// Create the server
- Server server = new Server(8080);
+ Server server = new Server(port);
// Enable parsing of jndi-related parts of web.xml and jetty-env.xml
Configuration.ClassList classlist = Configuration.ClassList
@@ -46,9 +47,8 @@ public static void main(String[] args) throws Exception
// Create a WebApp
WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/");
- File warFile = new File(
- "../../jetty-distribution/target/distribution/demo-base/webapps/test-jndi.war");
- webapp.setWar(warFile.getAbsolutePath());
+ Path testJndiWar = JettyDistribution.resolve("demo-base/webapps/test-jndi.war");
+ webapp.setWarResource(new PathResource(testJndiWar));
server.setHandler(webapp);
// Register new transaction manager in JNDI
@@ -64,7 +64,7 @@ public static void main(String[] args) throws Exception
// java.lang.Integer
// 4000
//
- new org.eclipse.jetty.plus.jndi.EnvEntry(server, "woggle", new Integer(4000), false);
+ new org.eclipse.jetty.plus.jndi.EnvEntry(server, "woggle", 4000, false);
// Define an env entry with webapp scope.
// At runtime, the webapp accesses this as java:comp/env/wiggle
@@ -77,7 +77,7 @@ public static void main(String[] args) throws Exception
// Note that the last arg of "true" means that this definition for
// "wiggle" would override an entry of the
// same name in web.xml
- new org.eclipse.jetty.plus.jndi.EnvEntry(webapp, "wiggle", new Double(100), true);
+ new org.eclipse.jetty.plus.jndi.EnvEntry(webapp, "wiggle", 100d, true);
// Register a reference to a mail service scoped to the webapp.
// This must be linked to the webapp by an entry in web.xml:
@@ -87,7 +87,8 @@ public static void main(String[] args) throws Exception
// Container
//
// At runtime the webapp accesses this as java:comp/env/mail/Session
- org.eclipse.jetty.jndi.factories.MailSessionReference mailref = new org.eclipse.jetty.jndi.factories.MailSessionReference();
+ org.eclipse.jetty.jndi.factories.MailSessionReference mailref =
+ new org.eclipse.jetty.jndi.factories.MailSessionReference();
mailref.setUser("CHANGE-ME");
mailref.setPassword("CHANGE-ME");
Properties props = new Properties();
@@ -109,6 +110,13 @@ public static void main(String[] args) throws Exception
// java:comp/env/jdbc/mydatasource
new org.eclipse.jetty.plus.jndi.Resource(
webapp, "jdbc/mydatasource", new com.acme.MockDataSource());
+ return server;
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Server server = createServer(port);
server.start();
server.join();
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/SimplestServer.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/SimplestServer.java
index a48235c55d59..3bdb6d4fa277 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/SimplestServer.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/SimplestServer.java
@@ -25,11 +25,20 @@
*/
public class SimplestServer
{
+ public static Server createServer(int port)
+ {
+ Server server = new Server(port);
+ // This has a connector listening on port specified
+ // and no handlers, meaning all requests will result
+ // in a 404 response
+ return server;
+ }
+
public static void main(String[] args) throws Exception
{
- Server server = new Server(8080);
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Server server = createServer(port);
server.start();
- server.dumpStdErr();
server.join();
}
}
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/SplitFileServer.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/SplitFileServer.java
index 4a681baa93e6..f8b46272b566 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/SplitFileServer.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/SplitFileServer.java
@@ -18,16 +18,14 @@
package org.eclipse.jetty.embedded;
-import java.io.File;
+import java.nio.file.Paths;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.server.handler.ResourceHandler;
-import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
+import org.eclipse.jetty.util.resource.PathResource;
import org.eclipse.jetty.util.resource.Resource;
/**
@@ -37,59 +35,68 @@
*/
public class SplitFileServer
{
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port, Resource baseResource0, Resource baseResource1)
{
// Create the Server object and a corresponding ServerConnector and then
// set the port for the connector. In this example the server will
- // listen on port 8090. If you set this to port 0 then when the server
+ // listen on port 8080. If you set this to port 0 then when the server
// has been started you can called connector.getLocalPort() to
// programmatically get the port the server started on.
Server server = new Server();
ServerConnector connector = new ServerConnector(server);
- connector.setPort(8090);
- server.setConnectors(new Connector[]{connector});
+ connector.setPort(port);
+ server.addConnector(connector);
// Create a Context Handler and ResourceHandler. The ContextHandler is
// getting set to "/" path but this could be anything you like for
- // builing out your url. Note how we are setting the ResourceBase using
+ // building out your url. Note how we are setting the ResourceBase using
// our jetty maven testing utilities to get the proper resource
// directory, you needn't use these, you simply need to supply the paths
// you are looking to serve content from.
ResourceHandler rh0 = new ResourceHandler();
+ rh0.setDirectoriesListed(false);
ContextHandler context0 = new ContextHandler();
context0.setContextPath("/");
- File dir0 = MavenTestingUtils.getTestResourceDir("dir0");
- context0.setBaseResource(Resource.newResource(dir0));
+ context0.setBaseResource(baseResource0);
context0.setHandler(rh0);
// Rinse and repeat the previous item, only specifying a different
// resource base.
ResourceHandler rh1 = new ResourceHandler();
+ rh1.setDirectoriesListed(false);
ContextHandler context1 = new ContextHandler();
context1.setContextPath("/");
- File dir1 = MavenTestingUtils.getTestResourceDir("dir1");
- context1.setBaseResource(Resource.newResource(dir1));
+ context1.setBaseResource(baseResource1);
context1.setHandler(rh1);
// Create a ContextHandlerCollection and set the context handlers to it.
// This will let jetty process urls against the declared contexts in
// order to match up content.
- ContextHandlerCollection contexts = new ContextHandlerCollection();
- contexts.setHandlers(new Handler[]{context0, context1});
-
+ ContextHandlerCollection contexts = new ContextHandlerCollection(
+ context0, context1
+ );
server.setHandler(contexts);
+ return server;
+ }
- // Start things up!
- server.start();
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Resource resource0 = new PathResource(Paths.get("src/test/resources/dir0"));
+ Resource resource1 = new PathResource(Paths.get("src/test/resources/dir1"));
+
+ Server server = createServer(port, resource0, resource1);
// Dump the server state
- System.out.println(server.dump());
+ server.setDumpAfterStart(true);
+
+ // Start things up!
+ server.start();
// The use of server.join() the will make the current thread join and
// wait until the server is done executing.
- // See http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()
server.join();
}
}
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/WebSocketJsrServer.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/WebSocketJsrServer.java
index c880bf229ad5..1f67d7852aee 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/WebSocketJsrServer.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/WebSocketJsrServer.java
@@ -26,7 +26,6 @@
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.websocket.jsr356.server.ServerContainer;
import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer;
/**
@@ -47,29 +46,38 @@ public void onMessage(Session session, String message)
}
}
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port)
{
- Server server = new Server(8080);
+ Server server = new Server(port);
HandlerList handlers = new HandlerList();
- ServletContextHandler context = new ServletContextHandler(
- ServletContextHandler.SESSIONS);
+ ServletContextHandler context = new ServletContextHandler();
context.setContextPath("/");
handlers.addHandler(context);
// Enable javax.websocket configuration for the context
- ServerContainer wsContainer = WebSocketServerContainerInitializer
- .configureContext(context);
-
- // Add your websockets to the container
- wsContainer.addEndpoint(EchoJsrSocket.class);
+ WebSocketServerContainerInitializer.configure(context,
+ (servletContext, serverContainer) ->
+ {
+ // Add your websocket to the javax.websocket.server.ServerContainer
+ serverContainer.addEndpoint(EchoJsrSocket.class);
+ }
+ );
handlers.addHandler(new DefaultHandler());
server.setHandler(handlers);
+
+ return server;
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Server server = createServer(port);
+
server.start();
- context.dumpStdErr();
server.join();
}
}
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/WebSocketServer.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/WebSocketServer.java
index ea92c922a17d..172b5ffb36ac 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/WebSocketServer.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/WebSocketServer.java
@@ -20,7 +20,6 @@
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
import org.eclipse.jetty.websocket.api.annotations.WebSocket;
@@ -61,20 +60,25 @@ public void configure(WebSocketServletFactory factory)
}
}
- public static void main(String[] args) throws Exception
+ public static Server createServer(int port)
{
- Server server = new Server(8080);
+ Server server = new Server(port);
- ServletContextHandler context = new ServletContextHandler(
- ServletContextHandler.SESSIONS);
+ ServletContextHandler context = new ServletContextHandler();
context.setContextPath("/");
server.setHandler(context);
// Add the echo socket servlet to the /echo path map
- context.addServlet(new ServletHolder(EchoServlet.class), "/echo");
+ context.addServlet(EchoServlet.class, "/echo");
+ return server;
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
+ Server server = createServer(port);
server.start();
- context.dumpStdErr();
server.join();
}
}
diff --git a/examples/embedded/src/main/resources/content.jar b/examples/embedded/src/main/other/content.jar
similarity index 100%
rename from examples/embedded/src/main/resources/content.jar
rename to examples/embedded/src/main/other/content.jar
diff --git a/examples/embedded/src/main/resources/etc/keystore b/examples/embedded/src/main/resources/etc/keystore
new file mode 100644
index 000000000000..d6592f95ee93
Binary files /dev/null and b/examples/embedded/src/main/resources/etc/keystore differ
diff --git a/examples/embedded/src/main/resources/etc/keystore.pkf b/examples/embedded/src/main/resources/etc/keystore.pkf
new file mode 100644
index 000000000000..443818e87df2
--- /dev/null
+++ b/examples/embedded/src/main/resources/etc/keystore.pkf
@@ -0,0 +1,20 @@
+Bag Attributes
+ friendlyName: jetty
+ localKeyID: 54 69 6D 65 20 31 34 32 33 31 39 38 30 39 33 31 31 35
+Key Attributes:
+-----BEGIN PRIVATE KEY-----
+MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIPh4Q0t4xklXTzX
+N2VAb47r5n7idAupp4CTNEhhT6lS70iA+A8i4+0lSEHWAogvd9jl3H7SvScr30QM
+4ieC0JCGSOwGc8f+yqKrO56PPd5OuqW380BJ0r74jJczU9CcsuavHD7e6mRLUnmj
+xM20NSxrcicMiPUHY1mJZtN9swtxAgMBAAECgYADS9P6Jll0uXBZIu/pgfDH27GJ
+HlPULstW9VbrMDNzgfUlFMQebLrRpIrnyleJ29Xc//HA4beEkR4lb0T/w88+pEkt
+7fhYeqRLPIfpDOgzloynnsoPcd8f/PypbimQrNLmBiG1178nVcy4Yoh5lYVIJwtU
+3VriqDlvAfTLrrx8AQJBAMLWuh27Hb8xs3LRg4UD7hcv8tJejstm08Y+czRz7cO0
+RENa3aDjGFSegc+IUfdez7BP8uDw+PwE+jybmTvaliECQQCtR/anCY1WS28/bKvy
+lmIwoI15eraBdVFkN0Hfxh+9PfR3rMD5uyvukT5GgTtY/XxADyafSTaipDJiZHJI
+EitRAkBjeCBYYVjUbVlBuvi8Bb+dktsSzzdzXDGtueAy3SR7jyJyiIcxRf775Fg9
+TUkbUwoQ5yAF+sACWcAvBPj796JBAkAEZEeHEkHnxv+pztpIyrDwZJFRW9/WRh/q
+90+PGVlilXhltBYr/idt43Z9mPblGX+VrAyhitx8oMa6IauX0gYRAkEAgnyVeXrD
+jDLUZRA3P8Gu27k1k6GjbTYiUz3HKCz2/6+MZ2MK2qqwafgqocji029Q6dHdPD7a
+4QnRlvraUnyQLA==
+-----END PRIVATE KEY-----
diff --git a/examples/embedded/src/main/resources/etc/realm.properties b/examples/embedded/src/main/resources/etc/realm.properties
new file mode 100644
index 000000000000..f4b3490e9107
--- /dev/null
+++ b/examples/embedded/src/main/resources/etc/realm.properties
@@ -0,0 +1,20 @@
+#
+# This file defines users passwords and roles for a HashUserRealm
+#
+# The format is
+# : [, ...]
+#
+# Passwords may be clear text, obfuscated or checksummed. The class
+# org.eclipse.jetty.util.security.Password should be used to generate obfuscated
+# passwords or password checksums
+#
+# If DIGEST Authentication is used, the password must be in a recoverable
+# format, either plain text or OBF:.
+#
+jetty:MD5:164c88b302622e17050af52c89945d44,user
+admin:CRYPT:adpexzg3FUZAk,server-administrator,content-administrator,admin,user
+other:OBF:1xmk1w261u9r1w1c1xmq,user
+plain:plain,user
+user:password,user
+# This entry is for digest auth. The credential is a MD5 hash of username:realmname:password
+digest:MD5:6e120743ad67abfbc385bc2bb754e297,user
diff --git a/examples/embedded/src/main/resources/exampleserver.xml b/examples/embedded/src/main/resources/exampleserver.xml
index 8f843d7a5046..53063929766c 100644
--- a/examples/embedded/src/main/resources/exampleserver.xml
+++ b/examples/embedded/src/main/resources/exampleserver.xml
@@ -7,7 +7,9 @@
-
- 8080
+
+
+
diff --git a/examples/embedded/src/main/resources/fileserver.xml b/examples/embedded/src/main/resources/fileserver.xml
index 126f0987c8ea..843dd3d6217a 100644
--- a/examples/embedded/src/main/resources/fileserver.xml
+++ b/examples/embedded/src/main/resources/fileserver.xml
@@ -7,7 +7,9 @@
- 8080
+
+
+
@@ -22,7 +24,9 @@
- index.html
- .
+
+
+
-
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/TestXml.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/AbstractEmbeddedTest.java
similarity index 50%
rename from examples/embedded/src/test/java/org/eclipse/jetty/embedded/TestXml.java
rename to examples/embedded/src/test/java/org/eclipse/jetty/embedded/AbstractEmbeddedTest.java
index bb45cf6c1240..9187fe17611d 100644
--- a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/TestXml.java
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/AbstractEmbeddedTest.java
@@ -18,14 +18,33 @@
package org.eclipse.jetty.embedded;
-import org.eclipse.jetty.xml.XmlConfiguration;
+import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
-public class TestXml
+public abstract class AbstractEmbeddedTest
{
- public static void main(String[] args) throws Exception
+ public HttpClient client;
+
+ @BeforeEach
+ public void startClient() throws Exception
+ {
+ SslContextFactory ssl = new SslContextFactory.Client(true);
+ client = new HttpClient(ssl);
+ client.start();
+ }
+
+ @AfterEach
+ public void stopClient() throws Exception
+ {
+ client.stop();
+ }
+
+ protected void dumpResponseHeaders(ContentResponse response)
{
- System.setProperty("jetty.home", "../jetty-distribution/target/distribution");
- XmlConfiguration.main("../jetty-jmx/src/main/config/etc/jetty-jmx.xml",
- "../jetty-server/src/main/config/etc/jetty.xml");
+ System.out.printf("%s %s %s%n", response.getVersion(), response.getStatus(), response.getReason());
+ System.out.println(response.getHeaders());
}
}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ExampleServerTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ExampleServerTest.java
new file mode 100644
index 000000000000..367b521b28e0
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ExampleServerTest.java
@@ -0,0 +1,90 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.client.util.StringContentProvider;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+
+public class ExampleServerTest extends AbstractEmbeddedTest
+{
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ server = ExampleServer.createServer(0);
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetHello() throws Exception
+ {
+ URI uri = server.getURI().resolve("/hello");
+
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("Hello"));
+ }
+
+ @Test
+ public void testGetEcho() throws Exception
+ {
+ URI uri = server.getURI().resolve("/echo/a/greeting");
+
+ String postBody = "Greetings from " + ExampleServerTest.class;
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.POST)
+ .content(new StringContentProvider(postBody))
+ .send();
+
+ // Check the response status code
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString(postBody));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ExampleServerXmlTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ExampleServerXmlTest.java
new file mode 100644
index 000000000000..23b28198e05a
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ExampleServerXmlTest.java
@@ -0,0 +1,67 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+
+public class ExampleServerXmlTest extends AbstractEmbeddedTest
+{
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ server = ExampleServerXml.createServer(0);
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetHello() throws Exception
+ {
+ URI uri = server.getURI().resolve("/hello");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("Hello"));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/FastFileServerTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/FastFileServerTest.java
new file mode 100644
index 000000000000..861ad3c8814b
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/FastFileServerTest.java
@@ -0,0 +1,92 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.io.BufferedWriter;
+import java.net.URI;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.toolchain.test.jupiter.WorkDir;
+import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+@ExtendWith(WorkDirExtension.class)
+public class FastFileServerTest extends AbstractEmbeddedTest
+{
+ private static final String TEXT_CONTENT = "I am an old man and I have known a great " +
+ "many troubles, but most of them never happened. - Mark Twain";
+ public WorkDir workDir;
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ Path baseDir = workDir.getEmptyPathDir();
+
+ Path textFile = baseDir.resolve("simple.txt");
+ try (BufferedWriter writer = Files.newBufferedWriter(textFile, UTF_8))
+ {
+ writer.write(TEXT_CONTENT);
+ }
+
+ server = FastFileServer.createServer(0, baseDir.toFile());
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetSimpleText() throws Exception
+ {
+ URI uri = server.getURI().resolve("/simple.txt");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ HttpFields responseHeaders = response.getHeaders();
+
+ assertThat("Content-Type", responseHeaders.get("Content-Type"), is("text/plain"));
+ assertThat("Content-Length", responseHeaders.getLongField("Content-Length"),
+ is((long)TEXT_CONTENT.length()));
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response body", responseBody, is(TEXT_CONTENT));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/FileServerTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/FileServerTest.java
new file mode 100644
index 000000000000..14ac4e5a53d1
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/FileServerTest.java
@@ -0,0 +1,93 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.io.BufferedWriter;
+import java.net.URI;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.toolchain.test.jupiter.WorkDir;
+import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension;
+import org.eclipse.jetty.util.resource.PathResource;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+@ExtendWith(WorkDirExtension.class)
+public class FileServerTest extends AbstractEmbeddedTest
+{
+ private static final String TEXT_CONTENT = "I am an old man and I have known a great " +
+ "many troubles, but most of them never happened. - Mark Twain";
+ public WorkDir workDir;
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ Path baseDir = workDir.getEmptyPathDir();
+
+ Path textFile = baseDir.resolve("simple.txt");
+ try (BufferedWriter writer = Files.newBufferedWriter(textFile, UTF_8))
+ {
+ writer.write(TEXT_CONTENT);
+ }
+
+ server = FileServer.createServer(0, new PathResource(baseDir));
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetSimpleText() throws Exception
+ {
+ URI uri = server.getURI().resolve("/simple.txt");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ HttpFields responseHeaders = response.getHeaders();
+
+ assertThat("Content-Type", responseHeaders.get("Content-Type"), is("text/plain"));
+ assertThat("Content-Length", responseHeaders.getLongField("Content-Length"),
+ is((long)TEXT_CONTENT.length()));
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response body", responseBody, is(TEXT_CONTENT));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/FileServerXmlTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/FileServerXmlTest.java
new file mode 100644
index 000000000000..813879e36c4d
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/FileServerXmlTest.java
@@ -0,0 +1,92 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.io.BufferedWriter;
+import java.net.URI;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.toolchain.test.jupiter.WorkDir;
+import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+@ExtendWith(WorkDirExtension.class)
+public class FileServerXmlTest extends AbstractEmbeddedTest
+{
+ private static final String TEXT_CONTENT = "I am an old man and I have known a great " +
+ "many troubles, but most of them never happened. - Mark Twain";
+ public WorkDir workDir;
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ Path baseDir = workDir.getEmptyPathDir();
+
+ Path textFile = baseDir.resolve("simple.txt");
+ try (BufferedWriter writer = Files.newBufferedWriter(textFile, UTF_8))
+ {
+ writer.write(TEXT_CONTENT);
+ }
+
+ server = FileServerXml.createServer(0, baseDir);
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetSimpleText() throws Exception
+ {
+ URI uri = server.getURI().resolve("/simple.txt");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ HttpFields responseHeaders = response.getHeaders();
+
+ assertThat("Content-Type", responseHeaders.get("Content-Type"), is("text/plain"));
+ assertThat("Content-Length", responseHeaders.getLongField("Content-Length"),
+ is((long)TEXT_CONTENT.length()));
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response body", responseBody, is(TEXT_CONTENT));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/JarServerTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/JarServerTest.java
new file mode 100644
index 000000000000..4e4bf368547e
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/JarServerTest.java
@@ -0,0 +1,83 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+
+public class JarServerTest extends AbstractEmbeddedTest
+{
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ server = JarServer.createServer(0);
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetDir0Test0() throws Exception
+ {
+ URI uri = server.getURI().resolve("/dir0/test0.txt");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("test0"));
+ }
+
+ @Test
+ public void testGetDir1Test1() throws Exception
+ {
+ URI uri = server.getURI().resolve("/dir1/test1.txt");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("test1"));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/LikeJettyXmlTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/LikeJettyXmlTest.java
new file mode 100644
index 000000000000..445ebe9d4db9
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/LikeJettyXmlTest.java
@@ -0,0 +1,97 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+import java.util.Map;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.util.component.LifeCycle;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+import static org.junit.jupiter.api.Assumptions.assumeTrue;
+
+public class LikeJettyXmlTest extends AbstractEmbeddedTest
+{
+ private Server server;
+ private URI serverPlainUri;
+ private URI serverSslUri;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ assumeTrue(JettyDistribution.DISTRIBUTION != null, "jetty-distribution not found");
+
+ server = LikeJettyXml.createServer(0, 0, false);
+ server.start();
+
+ Map ports = ServerUtil.fixDynamicPortConfigurations(server);
+
+ // Establish base URI's that use "localhost" to prevent tripping over
+ // the "REMOTE ACCESS" warnings in demo-base
+ serverPlainUri = URI.create("http://localhost:" + ports.get("plain") + "/");
+ serverSslUri = URI.create("https://localhost:" + ports.get("secure") + "/");
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ LifeCycle.stop(server);
+ }
+
+ @Test
+ public void testGetTest() throws Exception
+ {
+ URI uri = serverPlainUri.resolve("/test/");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("Hello"));
+ }
+
+ @Test
+ public void testGetTestSsl() throws Exception
+ {
+ URI uri = serverSslUri.resolve("/test/");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("Hello"));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ManyConnectorsTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ManyConnectorsTest.java
new file mode 100644
index 000000000000..0a19dac2859d
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ManyConnectorsTest.java
@@ -0,0 +1,95 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+import java.util.Map;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+
+public class ManyConnectorsTest extends AbstractEmbeddedTest
+{
+ private Server server;
+ private URI serverPlainUri;
+ private URI serverSslUri;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ server = ManyConnectors.createServer(0, 0);
+ server.start();
+
+ Map ports = ServerUtil.fixDynamicPortConfigurations(server);
+
+ // Establish base URI's that use "localhost" to prevent tripping over
+ // the "REMOTE ACCESS" warnings in demo-base
+ serverPlainUri = URI.create("http://localhost:" + ports.get("plain") + "/");
+ serverSslUri = URI.create("https://localhost:" + ports.get("secure") + "/");
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testPlainGetHello() throws Exception
+ {
+ URI uri = serverPlainUri.resolve("/hello");
+
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("Hello"));
+ }
+
+ @Test
+ public void testSecureGetHello() throws Exception
+ {
+ URI uri = serverSslUri.resolve("/hello");
+
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("Hello"));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ManyContextsTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ManyContextsTest.java
new file mode 100644
index 000000000000..bd439aee5521
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ManyContextsTest.java
@@ -0,0 +1,117 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+
+public class ManyContextsTest extends AbstractEmbeddedTest
+{
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ server = ManyContexts.createServer(0);
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetRootHello() throws Exception
+ {
+ URI uri = server.getURI().resolve("/");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("Root Hello"));
+ }
+
+ @Test
+ public void testGetFrenchHello() throws Exception
+ {
+ URI uri = server.getURI().resolve("/fr");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("Bonjour"));
+ }
+
+ @Test
+ public void testGetItalianGoodMorning() throws Exception
+ {
+ URI uri = server.getURI().resolve("/it");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("Buongiorno"));
+ }
+
+ @Test
+ public void testGetVirtualHostHello() throws Exception
+ {
+ int port = server.getURI().getPort();
+
+ URI uri = URI.create("http://127.0.0.2:" + port + "/");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("Virtual Hello"));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ManyHandlersTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ManyHandlersTest.java
new file mode 100644
index 000000000000..a6641d7c3d71
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ManyHandlersTest.java
@@ -0,0 +1,105 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+import java.util.Map;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.util.ajax.JSON;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+
+public class ManyHandlersTest extends AbstractEmbeddedTest
+{
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ server = ManyHandlers.createServer(0);
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetParams() throws Exception
+ {
+ URI uri = server.getURI().resolve("/params?a=b&foo=bar");
+
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .header(HttpHeader.ACCEPT_ENCODING, "gzip")
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test gzip
+ // Test that Gzip was used to produce the response
+ String contentEncoding = response.getHeaders().get(HttpHeader.CONTENT_ENCODING);
+ assertThat("Content-Encoding", contentEncoding, containsString("gzip"));
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ Object jsonObj = JSON.parse(responseBody);
+ Map jsonMap = (Map)jsonObj;
+ assertThat("Response JSON keys.size", jsonMap.keySet().size(), is(2));
+ }
+
+ @Test
+ public void testGetHello() throws Exception
+ {
+ URI uri = server.getURI().resolve("/hello");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .header(HttpHeader.ACCEPT_ENCODING, "gzip")
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test gzip
+ // Test that Gzip was used to produce the response
+ String contentEncoding = response.getHeaders().get(HttpHeader.CONTENT_ENCODING);
+ assertThat("Content-Encoding", contentEncoding, containsString("gzip"));
+
+ // test expected header from wrapper
+ String welcome = response.getHeaders().get("X-Welcome");
+ assertThat("X-Welcome header", welcome, containsString("Greetings from WelcomeWrapHandler"));
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("Hello"));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ManyServletContextsTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ManyServletContextsTest.java
new file mode 100644
index 000000000000..6cc211159575
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ManyServletContextsTest.java
@@ -0,0 +1,115 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+
+public class ManyServletContextsTest extends AbstractEmbeddedTest
+{
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ server = ManyServletContexts.createServer(0);
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetHello() throws Exception
+ {
+ URI uri = server.getURI().resolve("/hello");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("Hello"));
+ }
+
+ @Test
+ public void testGetItalianHello() throws Exception
+ {
+ URI uri = server.getURI().resolve("/it/hello");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("Ciao"));
+ }
+
+ @Test
+ public void testGetFrenchHello() throws Exception
+ {
+ URI uri = server.getURI().resolve("/fr/hello");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("Bonjour"));
+ }
+
+ @Test
+ public void testGetOtherYo() throws Exception
+ {
+ URI uri = server.getURI().resolve("/other/hello.yo");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("YO!"));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/MinimalServletsTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/MinimalServletsTest.java
new file mode 100644
index 000000000000..18354a1f07c6
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/MinimalServletsTest.java
@@ -0,0 +1,67 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+
+public class MinimalServletsTest extends AbstractEmbeddedTest
+{
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ server = MinimalServlets.createServer(0);
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetHello() throws Exception
+ {
+ URI uri = server.getURI().resolve("/hello");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("Hello"));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneConnectorTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneConnectorTest.java
new file mode 100644
index 000000000000..d700bb0272bc
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneConnectorTest.java
@@ -0,0 +1,67 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+
+public class OneConnectorTest extends AbstractEmbeddedTest
+{
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ server = OneConnector.createServer(0);
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetHello() throws Exception
+ {
+ URI uri = server.getURI().resolve("/hello");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("Hello"));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneContextTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneContextTest.java
new file mode 100644
index 000000000000..9d12b7f1a36e
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneContextTest.java
@@ -0,0 +1,67 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+
+public class OneContextTest extends AbstractEmbeddedTest
+{
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ server = OneContext.createServer(0);
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetHello() throws Exception
+ {
+ URI uri = server.getURI().resolve("/hello");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("Hello"));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneHandlerTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneHandlerTest.java
new file mode 100644
index 000000000000..920e24c59f4b
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneHandlerTest.java
@@ -0,0 +1,67 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+
+public class OneHandlerTest extends AbstractEmbeddedTest
+{
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ server = OneHandler.createServer(0);
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetHello() throws Exception
+ {
+ URI uri = server.getURI().resolve("/hello");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("Hello"));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneServletContextJmxStatsTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneServletContextJmxStatsTest.java
new file mode 100644
index 000000000000..ae627ca6c9c6
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneServletContextJmxStatsTest.java
@@ -0,0 +1,101 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+import java.util.Set;
+import javax.management.MBeanServer;
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.io.ConnectionStatistics;
+import org.eclipse.jetty.jmx.MBeanContainer;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.opentest4j.AssertionFailedError;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.allOf;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.greaterThanOrEqualTo;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+@ExtendWith(WorkDirExtension.class)
+public class OneServletContextJmxStatsTest extends AbstractEmbeddedTest
+{
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ server = OneServletContextJmxStats.createServer(0);
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetDumpViaPathInfo() throws Exception
+ {
+ URI uri = server.getURI().resolve("/dump/something");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody,
+ allOf(
+ containsString("DumpServlet"),
+ containsString("servletPath=/dump"),
+ containsString("pathInfo=/something")
+ )
+ );
+ }
+
+ @Test
+ public void testJmxConnectStatsPresent() throws Exception
+ {
+ MBeanContainer mbeanContainer = server.getBean(MBeanContainer.class);
+ MBeanServer mbeanServer = mbeanContainer.getMBeanServer();
+
+ String domain = ConnectionStatistics.class.getPackage().getName();
+ Set mbeanNames = mbeanServer.queryNames(ObjectName.getInstance(domain + ":type=connectionstatistics,*"), null);
+ ObjectName connStatsName = mbeanNames.stream().findFirst().orElseThrow(AssertionFailedError::new);
+ ObjectInstance mbeanConnStats = mbeanServer.getObjectInstance(connStatsName);
+ Number connections = (Number)mbeanServer.getAttribute(connStatsName, "connections");
+ assertThat("stats[connections]", connections, is(notNullValue()));
+ assertThat("stats[connections]", connections.longValue(), greaterThanOrEqualTo(0L));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneServletContextTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneServletContextTest.java
new file mode 100644
index 000000000000..5ed2433a9125
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneServletContextTest.java
@@ -0,0 +1,158 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.io.BufferedWriter;
+import java.net.URI;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.toolchain.test.jupiter.WorkDir;
+import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension;
+import org.eclipse.jetty.util.resource.PathResource;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.allOf;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+
+@ExtendWith(WorkDirExtension.class)
+public class OneServletContextTest extends AbstractEmbeddedTest
+{
+ private static final String TEXT_CONTENT = "The secret of getting ahead is getting started. - Mark Twain";
+ public WorkDir workDir;
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ Path baseDir = workDir.getEmptyPathDir();
+
+ Path textFile = baseDir.resolve("simple.txt");
+ try (BufferedWriter writer = Files.newBufferedWriter(textFile, UTF_8))
+ {
+ writer.write(TEXT_CONTENT);
+ }
+
+ server = OneServletContext.createServer(0, new PathResource(baseDir));
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetHello() throws Exception
+ {
+ URI uri = server.getURI().resolve("/hello/there");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("Hello"));
+ }
+
+ @Test
+ public void testGetDumpViaPathInfo() throws Exception
+ {
+ URI uri = server.getURI().resolve("/dump/something");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody,
+ allOf(
+ containsString("DumpServlet"),
+ containsString("servletPath=/dump"),
+ containsString("pathInfo=/something")
+ )
+ );
+ }
+
+ @Test
+ public void testGetDumpSuffix() throws Exception
+ {
+ URI uri = server.getURI().resolve("/another.dump");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody,
+ allOf(
+ containsString("DumpServlet"),
+ containsString("servletPath=/another.dump"),
+ containsString("pathInfo=null")
+ )
+ );
+ }
+
+ @Test
+ public void testGetTestDumpSuffix() throws Exception
+ {
+ URI uri = server.getURI().resolve("/test/another.dump");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ String filterResponseHeader = response.getHeaders().get("X-TestFilter");
+ assertThat("X-TestFilter header", filterResponseHeader, is("true"));
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody,
+ allOf(
+ containsString("DumpServlet"),
+ containsString("servletPath=/test/another.dump"),
+ containsString("pathInfo=null"),
+ containsString("request.attribute[X-ReqListener]=true"),
+ containsString("servletContext.attribute[X-Init]=true")
+ )
+ );
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneServletContextWithSessionTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneServletContextWithSessionTest.java
new file mode 100644
index 000000000000..0b96d4dedbcb
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneServletContextWithSessionTest.java
@@ -0,0 +1,95 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.io.BufferedWriter;
+import java.net.URI;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.toolchain.test.jupiter.WorkDir;
+import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension;
+import org.eclipse.jetty.util.resource.PathResource;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.allOf;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+
+@ExtendWith(WorkDirExtension.class)
+public class OneServletContextWithSessionTest extends AbstractEmbeddedTest
+{
+ private static final String TEXT_CONTENT = "Do the right thing. It will gratify some people and astonish the rest. - Mark Twain";
+ public WorkDir workDir;
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ Path baseDir = workDir.getEmptyPathDir();
+
+ Path textFile = baseDir.resolve("simple.txt");
+ try (BufferedWriter writer = Files.newBufferedWriter(textFile, UTF_8))
+ {
+ writer.write(TEXT_CONTENT);
+ }
+
+ server = OneServletContextWithSession.createServer(0, new PathResource(baseDir));
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetHello() throws Exception
+ {
+ URI uri = server.getURI().resolve("/");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+ String setCookieValue = response.getHeaders().get(HttpHeader.SET_COOKIE);
+ assertThat("Set-Cookie value", setCookieValue, containsString("JSESSIONID="));
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody,
+ allOf(
+ containsString("session.getId() = "),
+ containsString("session.isNew() = true")
+ )
+ );
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneWebAppTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneWebAppTest.java
new file mode 100644
index 000000000000..7f9eae15003a
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneWebAppTest.java
@@ -0,0 +1,71 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.util.component.LifeCycle;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+import static org.junit.jupiter.api.Assumptions.assumeTrue;
+
+public class OneWebAppTest extends AbstractEmbeddedTest
+{
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ assumeTrue(JettyDistribution.DISTRIBUTION != null, "jetty-distribution not found");
+
+ server = OneWebApp.createServer(0);
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ LifeCycle.stop(server);
+ }
+
+ @Test
+ public void testGetAsyncRest() throws Exception
+ {
+ URI uri = server.getURI().resolve("/testAsync?items=mouse,beer,gnome");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("Asynchronous: mouse,beer,gnome"));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneWebAppWithJspTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneWebAppWithJspTest.java
new file mode 100644
index 000000000000..9f858925596f
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/OneWebAppWithJspTest.java
@@ -0,0 +1,112 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.util.component.LifeCycle;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+import static org.junit.jupiter.api.Assumptions.assumeTrue;
+
+public class OneWebAppWithJspTest extends AbstractEmbeddedTest
+{
+ private Server server;
+ private URI serverLocalUri;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ assumeTrue(JettyDistribution.DISTRIBUTION != null, "jetty-distribution not found");
+
+ server = OneWebAppWithJsp.createServer(0);
+ server.start();
+
+ // Use URI based on "localhost" to get past "REMOTE ACCESS!" protection of demo war
+ serverLocalUri = URI.create("http://localhost:" + server.getURI().getPort() + "/");
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ LifeCycle.stop(server);
+ }
+
+ @Test
+ public void testGetDumpInfo() throws Exception
+ {
+ URI uri = serverLocalUri.resolve("/dump/info");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("getProtocol:
HTTP/1.1"));
+ }
+
+ @Test
+ public void testGetJspExpr() throws Exception
+ {
+ URI uri = serverLocalUri.resolve("/jsp/expr.jsp?A=1");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ String userAgent = client.getUserAgentField().getValue();
+ assertThat("Response Content", responseBody, containsString(" | " + userAgent + " | "));
+ }
+
+ @Test
+ public void testGetJstlExpr() throws Exception
+ {
+ URI uri = serverLocalUri.resolve("/jsp/jstl.jsp");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("JSTL Example
"));
+ for (int i = 1; i <= 10; i++)
+ {
+ assertThat("Reponse content (counting)", responseBody, containsString("" + i));
+ }
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ProxyServerTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ProxyServerTest.java
new file mode 100644
index 000000000000..c53d8a967401
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ProxyServerTest.java
@@ -0,0 +1,72 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+
+import org.eclipse.jetty.client.HttpProxy;
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+
+public class ProxyServerTest extends AbstractEmbeddedTest
+{
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ server = ProxyServer.createServer(0);
+ server.start();
+
+ URI uri = server.getURI();
+ client.getProxyConfiguration().getProxies().add(new HttpProxy("localhost", uri.getPort()));
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetProxiedRFC() throws Exception
+ {
+ URI uri = URI.create("https://tools.ietf.org/rfc/rfc7230.txt");
+
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing"));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/RewriteServerTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/RewriteServerTest.java
new file mode 100644
index 000000000000..775f550208c5
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/RewriteServerTest.java
@@ -0,0 +1,83 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+
+public class RewriteServerTest extends AbstractEmbeddedTest
+{
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ server = RewriteServer.createServer(0);
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetRewriteFooInName() throws Exception
+ {
+ URI uri = server.getURI().resolve("/do-be-foo-be-do");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("requestURI=/do-be-FOO-be-do"));
+ }
+
+ @Test
+ public void testGetRewriteFooInPath() throws Exception
+ {
+ URI uri = server.getURI().resolve("/do/be/foo/be/do.it");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("requestURI=/do/be/FOO/be/do.it"));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/SecuredHelloHandlerTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/SecuredHelloHandlerTest.java
new file mode 100644
index 000000000000..892330b392c0
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/SecuredHelloHandlerTest.java
@@ -0,0 +1,85 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+import java.util.Base64;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+
+public class SecuredHelloHandlerTest extends AbstractEmbeddedTest
+{
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ server = SecuredHelloHandler.createServer(0);
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetWithoutAuth() throws Exception
+ {
+ URI uri = server.getURI().resolve("/hello");
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.UNAUTHORIZED_401));
+
+ // dumpResponseHeaders(response);
+ }
+
+ @Test
+ public void testGetWithAuth() throws Exception
+ {
+ URI uri = server.getURI().resolve("/hello");
+
+ String authEncoded = Base64.getEncoder().encodeToString("user:password".getBytes(UTF_8));
+ ContentResponse response = client.newRequest(uri)
+ .method(HttpMethod.GET)
+ .header(HttpHeader.AUTHORIZATION, "Basic " + authEncoded)
+ .send();
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("Hello World
"));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ServerUtil.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ServerUtil.java
new file mode 100644
index 000000000000..ad41662e45c2
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ServerUtil.java
@@ -0,0 +1,88 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.HttpConnectionFactory;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.SslConnectionFactory;
+
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+public class ServerUtil
+{
+ /**
+ * Fix the HttpConfiguration entries for securePort after the dynamic ports have been bound.
+ *
+ * @param server the server to correct.
+ */
+ public static Map fixDynamicPortConfigurations(Server server)
+ {
+ // Fix ports in HttpConfiguration (since we are using dynamic port assignment for this testcase)
+ HttpConfiguration plainHttpConfiguration = null;
+ HttpConfiguration secureHttpConfiguration = null;
+ int plainHttpPort = -1;
+ int secureHttpPort = -1;
+
+ for (Connector connector : server.getConnectors())
+ {
+ if (connector instanceof ServerConnector)
+ {
+ ServerConnector serverConnector = (ServerConnector)connector;
+ SslConnectionFactory sslConnectionFactory = serverConnector.getConnectionFactory(SslConnectionFactory.class);
+ HttpConnectionFactory httpConnectionFactory = serverConnector.getConnectionFactory(HttpConnectionFactory.class);
+ if (httpConnectionFactory != null)
+ {
+ HttpConfiguration configuration = httpConnectionFactory.getHttpConfiguration();
+ if (sslConnectionFactory != null)
+ {
+ secureHttpConfiguration = configuration;
+ secureHttpPort = serverConnector.getLocalPort();
+ }
+ else
+ {
+ plainHttpConfiguration = configuration;
+ plainHttpPort = serverConnector.getLocalPort();
+ }
+ }
+ }
+ }
+
+ assertNotNull(plainHttpConfiguration, "Plain HTTP Configuration");
+ assertNotEquals(plainHttpPort, -1, "Dynamic Plain HTTP Port");
+
+ assertNotNull(secureHttpConfiguration, "Secure HTTP Configuration");
+ assertNotEquals(secureHttpPort, -1, "Dynamic Secure Port");
+
+ plainHttpConfiguration.setSecurePort(secureHttpPort);
+ secureHttpConfiguration.setSecurePort(secureHttpPort);
+
+ Map ports = new HashMap<>();
+ ports.put("plain", plainHttpPort);
+ ports.put("secure", secureHttpPort);
+
+ return ports;
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ServerWithAnnotationsTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ServerWithAnnotationsTest.java
new file mode 100644
index 000000000000..3662334ea265
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ServerWithAnnotationsTest.java
@@ -0,0 +1,70 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.util.component.LifeCycle;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
+import static org.junit.jupiter.api.Assumptions.assumeTrue;
+
+public class ServerWithAnnotationsTest extends AbstractEmbeddedTest
+{
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ assumeTrue(JettyDistribution.DISTRIBUTION != null, "jetty-distribution not found");
+
+ server = ServerWithAnnotations.createServer(0);
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ LifeCycle.stop(server);
+ }
+
+ @Test
+ public void testGetTest() throws Exception
+ {
+ URI uri = server.getURI().resolve("/test");
+ ContentResponse response = client.GET(uri);
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("maxAmount=55.0"));
+ assertThat("Response Content", responseBody, not(containsString("")));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ServerWithJMXTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ServerWithJMXTest.java
new file mode 100644
index 000000000000..9a5d3ab9d2a7
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ServerWithJMXTest.java
@@ -0,0 +1,62 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.util.Optional;
+import java.util.Set;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.eclipse.jetty.jmx.MBeanContainer;
+import org.eclipse.jetty.server.Server;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class ServerWithJMXTest extends AbstractEmbeddedTest
+{
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ server = ServerWithJMX.createServer(0);
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetTest() throws Exception
+ {
+ MBeanContainer mbeanContainer = server.getBean(MBeanContainer.class);
+ MBeanServer mbeanServer = mbeanContainer.getMBeanServer();
+
+ String name = "org.eclipse.jetty.jmx:name=rmiconnectorserver,*";
+ Set mbeanNames = mbeanServer.queryNames(ObjectName.getInstance(name), null);
+ Optional rmiConnectorNameOptional = mbeanNames.stream().findFirst();
+ assertTrue(rmiConnectorNameOptional.isPresent(), "Has RMI Connector Server");
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ServerWithJNDITest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ServerWithJNDITest.java
new file mode 100644
index 000000000000..603b4ae8023b
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/ServerWithJNDITest.java
@@ -0,0 +1,78 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.util.component.LifeCycle;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.allOf;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
+import static org.junit.jupiter.api.Assumptions.assumeTrue;
+
+public class ServerWithJNDITest extends AbstractEmbeddedTest
+{
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ assumeTrue(JettyDistribution.DISTRIBUTION != null, "jetty-distribution not found");
+
+ server = ServerWithJNDI.createServer(0);
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ LifeCycle.stop(server);
+ }
+
+ @Test
+ public void testGetTest() throws Exception
+ {
+ URI uri = server.getURI().resolve("/test");
+ ContentResponse response = client.GET(uri);
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody,
+ allOf(
+ containsString("java:comp/env/woggle"),
+ containsString("java:comp/env/gargle"),
+ containsString("java:comp/env/wiggle")
+ )
+ );
+
+ assertThat("Response Content", responseBody, not(containsString("")));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/SimplestServerTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/SimplestServerTest.java
new file mode 100644
index 000000000000..a21a8e438e6f
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/SimplestServerTest.java
@@ -0,0 +1,57 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+public class SimplestServerTest extends AbstractEmbeddedTest
+{
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ server = SimplestServer.createServer(0);
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetTest() throws Exception
+ {
+ URI uri = server.getURI().resolve("/test");
+ ContentResponse response = client.GET(uri);
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.NOT_FOUND_404));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/SplitFileServerTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/SplitFileServerTest.java
new file mode 100644
index 000000000000..5e5411260fce
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/SplitFileServerTest.java
@@ -0,0 +1,95 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.util.resource.PathResource;
+import org.eclipse.jetty.util.resource.Resource;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+
+public class SplitFileServerTest extends AbstractEmbeddedTest
+{
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ Path path0 = Paths.get("src/test/resources/dir0");
+ Path path1 = Paths.get("src/test/resources/dir1");
+ Resource resource0 = new PathResource(path0);
+ Resource resource1 = new PathResource(path1);
+
+ server = SplitFileServer.createServer(0, resource0, resource1);
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetTest0() throws Exception
+ {
+ URI uri = server.getURI().resolve("/test0.txt");
+ ContentResponse response = client.GET(uri);
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("test0"));
+ }
+
+ @Test
+ public void testGetTest1() throws Exception
+ {
+ URI uri = server.getURI().resolve("/test1.txt");
+ ContentResponse response = client.GET(uri);
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.OK_200));
+
+ // dumpResponseHeaders(response);
+
+ // test response content
+ String responseBody = response.getContentAsString();
+ assertThat("Response Content", responseBody, containsString("test1"));
+ }
+
+ @Test
+ public void testGetTest2() throws Exception
+ {
+ URI uri = server.getURI().resolve("/test2.txt");
+ ContentResponse response = client.GET(uri);
+ assertThat("HTTP Response Status", response.getStatus(), is(HttpStatus.NOT_FOUND_404));
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/WebSocketJsrServerTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/WebSocketJsrServerTest.java
new file mode 100644
index 000000000000..34a74d8a24ab
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/WebSocketJsrServerTest.java
@@ -0,0 +1,110 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+import java.util.concurrent.LinkedBlockingQueue;
+import javax.websocket.CloseReason;
+import javax.websocket.ContainerProvider;
+import javax.websocket.Endpoint;
+import javax.websocket.EndpointConfig;
+import javax.websocket.MessageHandler;
+import javax.websocket.Session;
+import javax.websocket.WebSocketContainer;
+
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.util.component.LifeCycle;
+import org.eclipse.jetty.websocket.api.util.WSURI;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+public class WebSocketJsrServerTest
+{
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ server = WebSocketJsrServer.createServer(0);
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetEcho() throws Exception
+ {
+ WebSocketContainer javaxWebSocketClient = ContainerProvider.getWebSocketContainer();
+ javaxWebSocketClient.setDefaultMaxSessionIdleTimeout(2000);
+ try
+ {
+ URI wsUri = WSURI.toWebsocket(server.getURI().resolve("/echo"));
+
+ TrackingClientEndpoint clientEndpoint = new TrackingClientEndpoint();
+
+ Session session = javaxWebSocketClient.connectToServer(clientEndpoint, wsUri);
+ session.getBasicRemote().sendText("Hello World");
+
+ String response = clientEndpoint.messages.poll(2, SECONDS);
+ assertThat("Response", response, is("Hello World"));
+ }
+ finally
+ {
+ LifeCycle.stop(javaxWebSocketClient);
+ }
+ }
+
+ public static class TrackingClientEndpoint extends Endpoint implements MessageHandler.Whole
+ {
+ public LinkedBlockingQueue messages = new LinkedBlockingQueue<>();
+
+ @Override
+ public void onMessage(String message)
+ {
+ messages.offer(message);
+ }
+
+ @Override
+ public void onOpen(Session session, EndpointConfig config)
+ {
+ session.addMessageHandler(this);
+ }
+
+ @Override
+ public void onError(Session session, Throwable thr)
+ {
+ super.onError(session, thr);
+ }
+
+ @Override
+ public void onClose(Session session, CloseReason closeReason)
+ {
+ super.onClose(session, closeReason);
+ }
+ }
+}
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/WebSocketServerTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/WebSocketServerTest.java
new file mode 100644
index 000000000000..faf74c41495f
--- /dev/null
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/WebSocketServerTest.java
@@ -0,0 +1,110 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.net.URI;
+import java.util.concurrent.Future;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.util.component.LifeCycle;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.websocket.api.Session;
+import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
+import org.eclipse.jetty.websocket.api.annotations.OnWebSocketError;
+import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
+import org.eclipse.jetty.websocket.api.annotations.WebSocket;
+import org.eclipse.jetty.websocket.api.util.WSURI;
+import org.eclipse.jetty.websocket.client.WebSocketClient;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+public class WebSocketServerTest
+{
+ private Server server;
+
+ @BeforeEach
+ public void startServer() throws Exception
+ {
+ server = WebSocketServer.createServer(0);
+ server.start();
+ }
+
+ @AfterEach
+ public void stopServer() throws Exception
+ {
+ server.stop();
+ }
+
+ @Test
+ public void testGetEcho() throws Exception
+ {
+ WebSocketClient webSocketClient = new WebSocketClient();
+ webSocketClient.setMaxIdleTimeout(2000);
+ try
+ {
+ webSocketClient.start();
+ URI wsUri = WSURI.toWebsocket(server.getURI().resolve("/echo"));
+
+ TrackingClientEndpoint clientEndpoint = new TrackingClientEndpoint();
+
+ Future sessionFut = webSocketClient.connect(clientEndpoint, wsUri);
+ Session session = sessionFut.get(2, SECONDS);
+ session.getRemote().sendString("Hello World");
+
+ String response = clientEndpoint.messages.poll(2, SECONDS);
+ assertThat("Response", response, is("Hello World"));
+ }
+ finally
+ {
+ LifeCycle.stop(webSocketClient);
+ }
+ }
+
+ @WebSocket
+ public static class TrackingClientEndpoint
+ {
+ private static final Logger LOG = Log.getLogger(TrackingClientEndpoint.class);
+ public LinkedBlockingQueue messages = new LinkedBlockingQueue<>();
+
+ @OnWebSocketMessage
+ public void onMessage(String message)
+ {
+ messages.offer(message);
+ }
+
+ @OnWebSocketError
+ public void onError(Throwable cause)
+ {
+ LOG.warn(cause);
+ }
+
+ @OnWebSocketClose
+ public void onClose(int statusCode, String reason)
+ {
+ LOG.debug("Closed({}, {})", statusCode, reason);
+ }
+ }
+}
diff --git a/examples/embedded/src/test/resources/jetty-logging.properties b/examples/embedded/src/test/resources/jetty-logging.properties
new file mode 100644
index 000000000000..b17c80c33308
--- /dev/null
+++ b/examples/embedded/src/test/resources/jetty-logging.properties
@@ -0,0 +1,11 @@
+org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
+org.eclipse.jetty.LEVEL=WARN
+org.eclipse.jetty.embedded.JettyDistribution.LEVEL=DEBUG
+#org.eclipse.jetty.STACKS=true
+#org.eclipse.jetty.STACKS=false
+#org.eclipse.jetty.io.LEVEL=DEBUG
+#org.eclipse.jetty.io.ssl.LEVEL=DEBUG
+#org.eclipse.jetty.server.LEVEL=DEBUG
+#org.eclipse.jetty.servlets.LEVEL=DEBUG
+#org.eclipse.jetty.alpn.LEVEL=DEBUG
+#org.eclipse.jetty.jmx.LEVEL=DEBUG
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java
index 4297a04a0313..6d08d5c7d119 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java
@@ -126,7 +126,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Gracefu
public static final int DEFAULT_LISTENER_TYPE_INDEX = 1;
public static final int EXTENDED_LISTENER_TYPE_INDEX = 0;
- private static final String __unimplmented = "Unimplemented - use org.eclipse.jetty.servlet.ServletContextHandler";
+ private static final String UNIMPLEMENTED_USE_SERVLET_CONTEXT_HANDLER = "Unimplemented {} - use org.eclipse.jetty.servlet.ServletContextHandler";
private static final Logger LOG = Log.getLogger(ContextHandler.class);
@@ -2479,7 +2479,7 @@ public ClassLoader getClassLoader()
@Override
public JspConfigDescriptor getJspConfigDescriptor()
{
- LOG.warn(__unimplmented);
+ LOG.warn(UNIMPLEMENTED_USE_SERVLET_CONTEXT_HANDLER, "getJspConfigDescriptor()");
return null;
}
@@ -2673,130 +2673,130 @@ public boolean setInitParameter(String name, String value)
@Override
public Dynamic addFilter(String filterName, Class extends Filter> filterClass)
{
- LOG.warn(__unimplmented);
+ LOG.warn(UNIMPLEMENTED_USE_SERVLET_CONTEXT_HANDLER, "addFilter(String, Class)");
return null;
}
@Override
public Dynamic addFilter(String filterName, Filter filter)
{
- LOG.warn(__unimplmented);
+ LOG.warn(UNIMPLEMENTED_USE_SERVLET_CONTEXT_HANDLER, "addFilter(String, Filter)");
return null;
}
@Override
public Dynamic addFilter(String filterName, String className)
{
- LOG.warn(__unimplmented);
+ LOG.warn(UNIMPLEMENTED_USE_SERVLET_CONTEXT_HANDLER, "addFilter(String, String)");
return null;
}
@Override
public javax.servlet.ServletRegistration.Dynamic addServlet(String servletName, Class extends Servlet> servletClass)
{
- LOG.warn(__unimplmented);
+ LOG.warn(UNIMPLEMENTED_USE_SERVLET_CONTEXT_HANDLER, "addServlet(String, Class)");
return null;
}
@Override
public javax.servlet.ServletRegistration.Dynamic addServlet(String servletName, Servlet servlet)
{
- LOG.warn(__unimplmented);
+ LOG.warn(UNIMPLEMENTED_USE_SERVLET_CONTEXT_HANDLER, "addServlet(String, Servlet)");
return null;
}
@Override
public javax.servlet.ServletRegistration.Dynamic addServlet(String servletName, String className)
{
- LOG.warn(__unimplmented);
+ LOG.warn(UNIMPLEMENTED_USE_SERVLET_CONTEXT_HANDLER, "addServlet(String, String)");
return null;
}
@Override
public T createFilter(Class c) throws ServletException
{
- LOG.warn(__unimplmented);
+ LOG.warn(UNIMPLEMENTED_USE_SERVLET_CONTEXT_HANDLER, "createFilter(Class)");
return null;
}
@Override
public T createServlet(Class c) throws ServletException
{
- LOG.warn(__unimplmented);
+ LOG.warn(UNIMPLEMENTED_USE_SERVLET_CONTEXT_HANDLER, "createServlet(Class)");
return null;
}
@Override
public Set getDefaultSessionTrackingModes()
{
- LOG.warn(__unimplmented);
+ LOG.warn(UNIMPLEMENTED_USE_SERVLET_CONTEXT_HANDLER, "getDefaultSessionTrackingModes()");
return null;
}
@Override
public Set getEffectiveSessionTrackingModes()
{
- LOG.warn(__unimplmented);
+ LOG.warn(UNIMPLEMENTED_USE_SERVLET_CONTEXT_HANDLER, "getEffectiveSessionTrackingModes()");
return null;
}
@Override
public FilterRegistration getFilterRegistration(String filterName)
{
- LOG.warn(__unimplmented);
+ LOG.warn(UNIMPLEMENTED_USE_SERVLET_CONTEXT_HANDLER, "getFilterRegistration(String)");
return null;
}
@Override
public Map getFilterRegistrations()
{
- LOG.warn(__unimplmented);
+ LOG.warn(UNIMPLEMENTED_USE_SERVLET_CONTEXT_HANDLER, "getFilterRegistrations()");
return null;
}
@Override
public ServletRegistration getServletRegistration(String servletName)
{
- LOG.warn(__unimplmented);
+ LOG.warn(UNIMPLEMENTED_USE_SERVLET_CONTEXT_HANDLER, "getServletRegistration(String)");
return null;
}
@Override
public Map getServletRegistrations()
{
- LOG.warn(__unimplmented);
+ LOG.warn(UNIMPLEMENTED_USE_SERVLET_CONTEXT_HANDLER, "getServletRegistrations()");
return null;
}
@Override
public SessionCookieConfig getSessionCookieConfig()
{
- LOG.warn(__unimplmented);
+ LOG.warn(UNIMPLEMENTED_USE_SERVLET_CONTEXT_HANDLER, "getSessionCookieConfig()");
return null;
}
@Override
public void setSessionTrackingModes(Set sessionTrackingModes)
{
- LOG.warn(__unimplmented);
+ LOG.warn(UNIMPLEMENTED_USE_SERVLET_CONTEXT_HANDLER, "setSessionTrackingModes(Set)");
}
@Override
public void addListener(String className)
{
- LOG.warn(__unimplmented);
+ LOG.warn(UNIMPLEMENTED_USE_SERVLET_CONTEXT_HANDLER, "addListener(String)");
}
@Override
public void addListener(T t)
{
- LOG.warn(__unimplmented);
+ LOG.warn(UNIMPLEMENTED_USE_SERVLET_CONTEXT_HANDLER, "addListener(T)");
}
@Override
public void addListener(Class extends EventListener> listenerClass)
{
- LOG.warn(__unimplmented);
+ LOG.warn(UNIMPLEMENTED_USE_SERVLET_CONTEXT_HANDLER, "addListener(Class)");
}
@Override
@@ -2843,14 +2843,14 @@ public void setEffectiveMinorVersion(int v)
@Override
public JspConfigDescriptor getJspConfigDescriptor()
{
- LOG.warn(__unimplmented);
+ LOG.warn(UNIMPLEMENTED_USE_SERVLET_CONTEXT_HANDLER, "getJspConfigDescriptor()");
return null;
}
@Override
public void declareRoles(String... roleNames)
{
- LOG.warn(__unimplmented);
+ LOG.warn(UNIMPLEMENTED_USE_SERVLET_CONTEXT_HANDLER, "declareRoles(String...)");
}
@Override
diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHolder.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHolder.java
index 9fb2b7e4ff66..599dd3be680b 100644
--- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHolder.java
+++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHolder.java
@@ -1265,9 +1265,10 @@ protected Servlet newInstance() throws ServletException, IllegalAccessException,
try
{
ServletContext ctx = getServletHandler().getServletContext();
- if (ctx == null)
- return getHeldClass().getDeclaredConstructor().newInstance();
- return ctx.createServlet(getHeldClass());
+ if (ctx instanceof ServletContextHandler.Context)
+ return ctx.createServlet(getHeldClass());
+ return getHeldClass().getDeclaredConstructor().newInstance();
+
}
catch (ServletException ex)
{
diff --git a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/AnnotationTest.java b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/AnnotationTest.java
index f734a7f0ef9d..4a028b968f0c 100644
--- a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/AnnotationTest.java
+++ b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/AnnotationTest.java
@@ -295,19 +295,19 @@ else if (!classNames.containsAll(__HandlesTypes))
out.println("private Double minAmount;");
out.println("");
if (maxAmount == null)
- out.println("Result: " + envResult + ": FAIL");
+ out.println("Result: " + envResult + ": FAIL");
else
out.println("
Result: " + envResult + ": " + (maxAmount.compareTo(new Double(55)) == 0 ? " PASS" : " FAIL") + "");
out.println("
JNDI Lookup Result: " + envLookupResult + "");
if (minAmount == null)
- out.println("
Result: " + envResult2 + ": FAIL");
+ out.println("Result: " + envResult2 + ": FAIL");
else
out.println("
Result: " + envResult2 + ": " + (minAmount.compareTo(new Double("0.99")) == 0 ? " PASS" : " FAIL") + "");
out.println("
JNDI Lookup Result: " + envLookupResult2 + "");
if (avgAmount == null)
- out.println("
Result: " + envResult3 + ": FAIL");
+ out.println("Result: " + envResult3 + ": FAIL");
else
out.println("
Result: " + envResult3 + ": " + (avgAmount.compareTo(new Double("1.25")) == 0 ? " PASS" : " FAIL") + "");
out.println("
JNDI Lookup Result: " + envLookupResult3 + "
");