Merge remote-tracking branch 'origin/jetty-9.4.x' into jetty-9.4.x-HttpConnection_UpgradeCheck

This commit is contained in:
Lachlan Roberts 2019-09-17 13:11:43 +10:00
commit a0cd331327
305 changed files with 11394 additions and 2643 deletions

View File

@ -2,6 +2,6 @@
Jan Bartel <janb@mortbay.com> AED5 EE6C 45D0 FE8D 5D1B 164F 27DE D4BF 6216 DB8F Jan Bartel <janb@mortbay.com> AED5 EE6C 45D0 FE8D 5D1B 164F 27DE D4BF 6216 DB8F
Jesse McConnell <jesse.mcconnell@gmail.com> 2A68 4B57 436A 81FA 8706 B53C 61C3 351A 438A 3B7D Jesse McConnell <jesse.mcconnell@gmail.com> 2A68 4B57 436A 81FA 8706 B53C 61C3 351A 438A 3B7D
Joakim Erdfelt <joakim.erdfelt@gmail.com> 5989 BAF7 6217 B843 D66B E55B 2D0E 1FB8 FE4B 68B4 Joakim Erdfelt <joakim.erdfelt@gmail.com> 5989 BAF7 6217 B843 D66B E55B 2D0E 1FB8 FE4B 68B4
Joakim Erdfelt <joakim@apache.org> B59B 67FD 7904 9843 67F9 3180 0818 D9D6 8FB6 7BAC Joakim Erdfelt <joakime@apache.org> B59B 67FD 7904 9843 67F9 3180 0818 D9D6 8FB6 7BAC
Joakim Erdfelt <joakim@erdfelt.com> BFBB 21C2 46D7 7768 3628 7A48 A04E 0C74 ABB3 5FEA Joakim Erdfelt <joakim@erdfelt.com> BFBB 21C2 46D7 7768 3628 7A48 A04E 0C74 ABB3 5FEA
Simone Bordet <simone.bordet@gmail.com> 8B09 6546 B1A8 F026 56B1 5D3B 1677 D141 BCF3 584D Simone Bordet <simone.bordet@gmail.com> 8B09 6546 B1A8 F026 56B1 5D3B 1677 D141 BCF3 584D

View File

@ -97,6 +97,7 @@ jetty-9.4.18.v20190429 - 29 April 2019
+ 3609 Fix infinispan start module dependencies + 3609 Fix infinispan start module dependencies
jetty-9.4.17.v20190418 - 18 April 2019 jetty-9.4.17.v20190418 - 18 April 2019
+ 2140 Infinispan and hazelcast changes to scavenge zombie expired sessions.
+ 3464 Split SslContextFactory into Client and Server + 3464 Split SslContextFactory into Client and Server
+ 3549 Directory Listing on Windows reveals Resource Base path + 3549 Directory Listing on Windows reveals Resource Base path
+ 3555 DefaultHandler Reveals Base Resource Path of each Context + 3555 DefaultHandler Reveals Base Resource Path of each Context

View File

@ -132,7 +132,12 @@
<dependency> <dependency>
<groupId>org.eclipse.jetty.toolchain</groupId> <groupId>org.eclipse.jetty.toolchain</groupId>
<artifactId>jetty-test-helper</artifactId> <artifactId>jetty-test-helper</artifactId>
<!-- scope>test</scope--> <scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.websocket</groupId>
<artifactId>websocket-client</artifactId>
<version>${project.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
@ -141,8 +146,27 @@
<classifier>tests</classifier> <classifier>tests</classifier>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-distribution</artifactId>
<version>${project.version}</version>
<type>tar.gz</type>
<scope>test</scope>
</dependency>
</dependencies> </dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<useManifestOnlyJar>false</useManifestOnlyJar>
</configuration>
</plugin>
</plugins>
</build>
<profiles> <profiles>
<profile> <profile>
<id>jdk9</id> <id>jdk9</id>

View File

@ -22,7 +22,6 @@ import java.io.IOException;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import javax.servlet.AsyncContext; import javax.servlet.AsyncContext;
import javax.servlet.ReadListener; import javax.servlet.ReadListener;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream; import javax.servlet.ServletInputStream;
import javax.servlet.ServletOutputStream; import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener; import javax.servlet.WriteListener;
@ -35,7 +34,7 @@ public class AsyncEchoServlet extends HttpServlet
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@Override @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 asyncContext = request.startAsync(request, response);
asyncContext.setTimeout(0); asyncContext.setTimeout(0);

View File

@ -20,6 +20,8 @@ package org.eclipse.jetty.embedded;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.Collections;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@ -45,12 +47,28 @@ public class DumpServlet extends HttpServlet
out.println("pathInfo=" + request.getPathInfo()); out.println("pathInfo=" + request.getPathInfo());
out.println("session=" + request.getSession(true).getId()); out.println("session=" + request.getSession(true).getId());
ServletContext servletContext = getServletContext();
String r = request.getParameter("resource"); String r = request.getParameter("resource");
if (r != null) 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("</pre>"); out.println("</pre>");
} }
} }

View File

@ -28,12 +28,12 @@ import org.eclipse.jetty.servlet.ServletContextHandler;
public class ExampleServer public class ExampleServer
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port)
{ {
Server server = new Server(); Server server = new Server();
ServerConnector connector = new ServerConnector(server); ServerConnector connector = new ServerConnector(server);
connector.setPort(8080); connector.setPort(port);
server.setConnectors(new Connector[]{connector}); server.setConnectors(new Connector[]{connector});
ServletContextHandler context = new ServletContextHandler(); ServletContextHandler context = new ServletContextHandler();
@ -45,6 +45,13 @@ public class ExampleServer
handlers.setHandlers(new Handler[]{context, new DefaultHandler()}); handlers.setHandlers(new Handler[]{context, new DefaultHandler()});
server.setHandler(handlers); 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.start();
server.join(); server.join();
} }

View File

@ -18,21 +18,31 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.resource.Resource; import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.xml.XmlConfiguration; import org.eclipse.jetty.xml.XmlConfiguration;
/** /**
* Configures and Starts a Jetty server from an XML declaration. * Configures and Starts a Jetty server from an XML declaration.
* <p>
* See <a href="https://raw.githubusercontent.com/eclipse/jetty.project/master/examples/embedded/src/main/resources/exampleserver.xml">exampleserver.xml</a>
* </p>
*/ */
public class ExampleServerXml 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. // Find Jetty XML (in classpath) that configures and starts Server.
// See src/main/resources/exampleserver.xml
Resource serverXml = Resource.newSystemResource("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();
} }
} }

View File

@ -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;
}
}
}

View File

@ -58,17 +58,24 @@ import org.eclipse.jetty.util.resource.Resource;
*/ */
public class FastFileServer 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(); HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[]{ handlers.setHandlers(new Handler[]{
new FastFileHandler(new File(System.getProperty("user.dir"))), new FastFileHandler(resourceBase),
new DefaultHandler() new DefaultHandler()
}); });
server.setHandler(handlers); 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.start();
server.join(); server.join();
} }

View File

@ -18,11 +18,16 @@
package org.eclipse.jetty.embedded; 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.Handler;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.DefaultHandler; import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler; import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.util.resource.PathResource;
import org.eclipse.jetty.util.resource.Resource;
/** /**
* Simple Jetty FileServer. * Simple Jetty FileServer.
@ -30,12 +35,12 @@ import org.eclipse.jetty.server.handler.ResourceHandler;
*/ */
public class FileServer 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 // 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, // 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. // 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 // 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. // 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 class FileServer
// In this example it is the current directory but it can be configured to anything that the jvm has access to. // 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.setDirectoriesListed(true);
resourceHandler.setWelcomeFiles(new String[]{"index.html"}); resourceHandler.setWelcomeFiles(new String[]{"index.html"});
resourceHandler.setResourceBase("."); resourceHandler.setBaseResource(baseResource);
// Add the ResourceHandler to the server. // Add the ResourceHandler to the server.
HandlerList handlers = new HandlerList(); HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[]{resourceHandler, new DefaultHandler()}); handlers.setHandlers(new Handler[]{resourceHandler, new DefaultHandler()});
server.setHandler(handlers); 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. // 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. // See "http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#join()" for more details.
server.start(); server.start();

View File

@ -18,6 +18,9 @@
package org.eclipse.jetty.embedded; 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.Server;
import org.eclipse.jetty.util.resource.Resource; import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.xml.XmlConfiguration; import org.eclipse.jetty.xml.XmlConfiguration;
@ -28,17 +31,25 @@ import org.eclipse.jetty.xml.XmlConfiguration;
* This server is identical to {@link FileServer}, except that it is configured * This server is identical to {@link FileServer}, except that it is configured
* via an {@link XmlConfiguration} config file that does the identical work. * via an {@link XmlConfiguration} config file that does the identical work.
* </p> * </p>
* <p>
* See <a href="https://raw.githubusercontent.com/eclipse/jetty.project/master/examples/embedded/src/main/resources/fileserver.xml">fileserver.xml</a>
* </p>
*/ */
public class FileServerXml 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"); Resource fileServerXml = Resource.newSystemResource("fileserver.xml");
XmlConfiguration configuration = new XmlConfiguration(fileServerXml); 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.start();
server.join(); server.join();
} }

View File

@ -51,7 +51,8 @@ public class HelloWorld extends AbstractHandler
public static void main(String[] args) throws Exception 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.setHandler(new HelloWorld());
server.start(); server.start();

View File

@ -18,9 +18,12 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.File; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.lang.management.ManagementFactory; 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.Date;
import java.util.EnumSet; import java.util.EnumSet;
import javax.servlet.DispatcherType; import javax.servlet.DispatcherType;
@ -54,6 +57,7 @@ import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.servlets.PushCacheFilter; import org.eclipse.jetty.servlets.PushCacheFilter;
import org.eclipse.jetty.util.resource.PathResource;
import org.eclipse.jetty.util.ssl.SslContextFactory; import org.eclipse.jetty.util.ssl.SslContextFactory;
/** /**
@ -63,6 +67,8 @@ public class Http2Server
{ {
public static void main(String... args) throws Exception 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(); Server server = new Server();
MBeanContainer mbContainer = new MBeanContainer( MBeanContainer mbContainer = new MBeanContainer(
@ -70,10 +76,11 @@ public class Http2Server
server.addBean(mbContainer); server.addBean(mbContainer);
ServletContextHandler context = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS); ServletContextHandler context = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS);
String docroot = "src/main/resources/docroot"; Path docroot = Paths.get("src/main/resources/docroot");
if (!new File(docroot).exists()) if (!Files.exists(docroot))
docroot = "examples/embedded/src/main/resources/docroot"; throw new FileNotFoundException(docroot.toString());
context.setResourceBase(docroot);
context.setBaseResource(new PathResource(docroot));
context.addFilter(PushCacheFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(PushCacheFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
// context.addFilter(PushSessionCacheFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST)); // context.addFilter(PushSessionCacheFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST));
context.addFilter(PushedTilesFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(PushedTilesFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
@ -84,21 +91,21 @@ public class Http2Server
// HTTP Configuration // HTTP Configuration
HttpConfiguration httpConfig = new HttpConfiguration(); HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.setSecureScheme("https"); httpConfig.setSecureScheme("https");
httpConfig.setSecurePort(8443); httpConfig.setSecurePort(securePort);
httpConfig.setSendXPoweredBy(true); httpConfig.setSendXPoweredBy(true);
httpConfig.setSendServerVersion(true); httpConfig.setSendServerVersion(true);
// HTTP Connector // HTTP Connector
ServerConnector http = new ServerConnector(server, new HttpConnectionFactory(httpConfig), new HTTP2CServerConnectionFactory(httpConfig)); ServerConnector http = new ServerConnector(server, new HttpConnectionFactory(httpConfig), new HTTP2CServerConnectionFactory(httpConfig));
http.setPort(8080); http.setPort(port);
server.addConnector(http); server.addConnector(http);
// SSL Context Factory for HTTPS and HTTP/2 // SSL Context Factory for HTTPS and HTTP/2
String jettyDistro = System.getProperty("jetty.distro", "../../jetty-distribution/target/distribution"); Path keystorePath = Paths.get("src/main/resources/etc/keystore").toAbsolutePath();
if (!new File(jettyDistro).exists()) if (!Files.exists(keystorePath))
jettyDistro = "jetty-distribution/target/distribution"; throw new FileNotFoundException(keystorePath.toString());
SslContextFactory sslContextFactory = new SslContextFactory.Server(); SslContextFactory sslContextFactory = new SslContextFactory.Server();
sslContextFactory.setKeyStorePath(jettyDistro + "/demo-base/etc/keystore"); sslContextFactory.setKeyStorePath(keystorePath.toString());
sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"); sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g"); sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
sslContextFactory.setCipherComparator(HTTP2Cipher.COMPARATOR); sslContextFactory.setCipherComparator(HTTP2Cipher.COMPARATOR);
@ -120,7 +127,7 @@ public class Http2Server
// HTTP/2 Connector // HTTP/2 Connector
ServerConnector http2Connector = ServerConnector http2Connector =
new ServerConnector(server, ssl, alpn, h2, new HttpConnectionFactory(httpsConfig)); new ServerConnector(server, ssl, alpn, h2, new HttpConnectionFactory(httpsConfig));
http2Connector.setPort(8443); http2Connector.setPort(securePort);
server.addConnector(http2Connector); server.addConnector(http2Connector);
ALPN.debug = false; ALPN.debug = false;

View File

@ -18,7 +18,11 @@
package org.eclipse.jetty.embedded; 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.Server;
import org.eclipse.jetty.server.handler.DefaultHandler; import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.HandlerList;
@ -28,24 +32,36 @@ import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.resource.Resource; 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 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(); ServletContextHandler context = new ServletContextHandler();
Resource.setDefaultUseCaches(true); 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.setBaseResource(base);
context.addServlet(new ServletHolder(new DefaultServlet()), "/"); context.addServlet(new ServletHolder(new DefaultServlet()), "/");
HandlerList handlers = new HandlerList(); HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[]{context, new DefaultHandler()}); handlers.addHandler(context);
handlers.addHandler(new DefaultHandler());
server.setHandler(handlers); 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.start();
server.join(); server.join();
} }

View File

@ -18,8 +18,9 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.File; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths;
import org.eclipse.jetty.util.StringUtil; import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Log;
@ -41,54 +42,80 @@ public class JettyDistribution
static static
{ {
Path distro = asJettyDistribution(System.getProperty("jetty.home")); Path distro = asJettyDistribution(System.getProperty("jetty.home"));
LOG.debug("JettyDistribution(prop(jetty.home)) = " + distro);
if (distro == null) if (distro == null)
{
distro = asJettyDistribution(System.getenv().get("JETTY_HOME")); distro = asJettyDistribution(System.getenv().get("JETTY_HOME"));
LOG.debug("JettyDistribution(env(JETTY_HOME)) = " + distro);
}
if (distro == null) if (distro == null)
{ {
try 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) while (distro == null && working != null)
{ {
distro = asJettyDistribution(working.resolve("jetty-distribution/target/distribution").toString()); distro = asJettyDistribution(working.resolve("jetty-distribution/target/distribution").toString());
working = working.getParent(); working = working.getParent();
} }
LOG.debug("JettyDistribution(working.resolve(...)) = " + distro);
} }
catch (Throwable cause) catch (Throwable cause)
{ {
LOG.warn(cause); LOG.warn(cause);
} }
} }
if (distro == null)
{
LOG.info("JettyDistribution() FAILURE: NOT FOUND");
}
else
{
LOG.debug("JettyDistribution() FOUND = " + distro);
}
DISTRIBUTION = distro; DISTRIBUTION = distro;
} }
private static Path asJettyDistribution(String test) private static Path asJettyDistribution(String jettyHome)
{ {
try try
{ {
if (StringUtil.isBlank(test)) if (jettyHome == null)
{ {
LOG.info("asJettyDistribution {} is blank", test);
return null; return null;
} }
File dir = new File(test); if (StringUtil.isBlank(jettyHome))
if (!dir.exists() || !dir.isDirectory())
{ {
LOG.info("asJettyDistribution {} is not a directory", test); LOG.debug("asJettyDistribution {} is blank", jettyHome);
return null; return null;
} }
File demoBase = new File(dir, "demo-base"); Path dir = Paths.get(jettyHome);
if (!demoBase.exists() || !demoBase.isDirectory()) if (!Files.exists(dir))
{ {
LOG.info("asJettyDistribution {} has no demo-base", test); LOG.debug("asJettyDistribution {} does not exist", jettyHome);
return null; return null;
} }
LOG.info("asJettyDistribution {}", dir); if (!Files.isDirectory(dir))
return dir.getAbsoluteFile().getCanonicalFile().toPath(); {
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) catch (Exception e)
{ {
@ -97,9 +124,16 @@ public class JettyDistribution
return null; return null;
} }
public static Path get()
{
if (DISTRIBUTION == null)
throw new RuntimeException("jetty-distribution not found");
return DISTRIBUTION;
}
public static Path resolve(String path) public static Path resolve(String path)
{ {
return DISTRIBUTION.resolve(path); return get().resolve(path);
} }
public static void main(String... arg) public static void main(String... arg)

View File

@ -18,8 +18,11 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.File; import java.io.FileNotFoundException;
import java.lang.management.ManagementFactory; 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.DeploymentManager;
import org.eclipse.jetty.deploy.PropertiesConfigurationManager; import org.eclipse.jetty.deploy.PropertiesConfigurationManager;
@ -58,21 +61,21 @@ import org.eclipse.jetty.webapp.Configuration;
*/ */
public class LikeJettyXml 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 // Path to as-built jetty-distribution directory
String jettyHomeBuild = JettyDistribution.DISTRIBUTION.toString(); Path jettyHomeBuild = JettyDistribution.get();
// Find jetty home and base directories // Find jetty home and base directories
String homePath = System.getProperty("jetty.home", jettyHomeBuild); String homePath = System.getProperty("jetty.home", jettyHomeBuild.toString());
File homeDir = new File(homePath); Path homeDir = Paths.get(homePath);
String basePath = System.getProperty("jetty.base", homeDir + "/demo-base"); String basePath = System.getProperty("jetty.base", homeDir.resolve("demo-base").toString());
File baseDir = new File(basePath); Path baseDir = Paths.get(basePath);
// Configure jetty.home and jetty.base system properties // Configure jetty.home and jetty.base system properties
String jettyHome = homeDir.getAbsolutePath(); String jettyHome = homeDir.toAbsolutePath().toString();
String jettyBase = baseDir.getAbsolutePath(); String jettyBase = baseDir.toAbsolutePath().toString();
System.setProperty("jetty.home", jettyHome); System.setProperty("jetty.home", jettyHome);
System.setProperty("jetty.base", jettyBase); System.setProperty("jetty.base", jettyBase);
@ -90,7 +93,7 @@ public class LikeJettyXml
// HTTP Configuration // HTTP Configuration
HttpConfiguration httpConfig = new HttpConfiguration(); HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.setSecureScheme("https"); httpConfig.setSecureScheme("https");
httpConfig.setSecurePort(8443); httpConfig.setSecurePort(securePort);
httpConfig.setOutputBufferSize(32768); httpConfig.setOutputBufferSize(32768);
httpConfig.setRequestHeaderSize(8192); httpConfig.setRequestHeaderSize(8192);
httpConfig.setResponseHeaderSize(8192); httpConfig.setResponseHeaderSize(8192);
@ -104,11 +107,6 @@ public class LikeJettyXml
handlers.setHandlers(new Handler[]{contexts, new DefaultHandler()}); handlers.setHandlers(new Handler[]{contexts, new DefaultHandler()});
server.setHandler(handlers); server.setHandler(handlers);
// Extra options
server.setDumpAfterStart(true);
server.setDumpBeforeStop(false);
server.setStopAtShutdown(true);
// === jetty-jmx.xml === // === jetty-jmx.xml ===
MBeanContainer mbContainer = new MBeanContainer( MBeanContainer mbContainer = new MBeanContainer(
ManagementFactory.getPlatformMBeanServer()); ManagementFactory.getPlatformMBeanServer());
@ -117,24 +115,21 @@ public class LikeJettyXml
// === jetty-http.xml === // === jetty-http.xml ===
ServerConnector http = new ServerConnector(server, ServerConnector http = new ServerConnector(server,
new HttpConnectionFactory(httpConfig)); new HttpConnectionFactory(httpConfig));
http.setPort(8080); http.setPort(port);
http.setIdleTimeout(30000); http.setIdleTimeout(30000);
server.addConnector(http); server.addConnector(http);
// === jetty-https.xml === // === jetty-https.xml ===
// SSL Context Factory // 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 sslContextFactory = new SslContextFactory.Server();
sslContextFactory.setKeyStorePath(jettyHome + "/../../../jetty-server/src/test/config/etc/keystore"); sslContextFactory.setKeyStorePath(keystorePath.toString());
sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"); sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g"); sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
sslContextFactory.setTrustStorePath(jettyHome + "/../../../jetty-server/src/test/config/etc/keystore"); sslContextFactory.setTrustStorePath(keystorePath.toString());
sslContextFactory.setTrustStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"); 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 // SSL HTTP Configuration
HttpConfiguration httpsConfig = new HttpConfiguration(httpConfig); HttpConfiguration httpsConfig = new HttpConfiguration(httpConfig);
@ -144,14 +139,17 @@ public class LikeJettyXml
ServerConnector sslConnector = new ServerConnector(server, ServerConnector sslConnector = new ServerConnector(server,
new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()), new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
new HttpConnectionFactory(httpsConfig)); new HttpConnectionFactory(httpsConfig));
sslConnector.setPort(8443); sslConnector.setPort(securePort);
server.addConnector(sslConnector); server.addConnector(sslConnector);
// === jetty-deploy.xml === // === jetty-deploy.xml ===
DeploymentManager deployer = new DeploymentManager(); DeploymentManager deployer = new DeploymentManager();
if (addDebugListener)
{
DebugListener debug = new DebugListener(System.err, true, true, true); DebugListener debug = new DebugListener(System.err, true, true, true);
server.addBean(debug); server.addBean(debug);
deployer.addLifeCycleBinding(new DebugListenerBinding(debug)); deployer.addLifeCycleBinding(new DebugListenerBinding(debug));
}
deployer.setContexts(contexts); deployer.setContexts(contexts);
deployer.setContextAttribute( deployer.setContextAttribute(
"org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", "org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
@ -215,6 +213,20 @@ public class LikeJettyXml
login.setHotReload(false); login.setHotReload(false);
server.addBean(login); 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 // Start the server
server.start(); server.start();
server.join(); server.join();

View File

@ -18,8 +18,10 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.File;
import java.io.FileNotFoundException; 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.http.HttpVersion;
import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Connector;
@ -36,23 +38,13 @@ import org.eclipse.jetty.util.ssl.SslContextFactory;
*/ */
public class ManyConnectors 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 // Since this example shows off SSL configuration, we need a keystore
// with the appropriate key. These lookup of jetty.home is purely a hack // with the appropriate key.
// to get access to a keystore that we use in many unit tests and should Path keystorePath = Paths.get("src/main/resources/etc/keystore").toAbsolutePath();
// probably be a direct path to your own keystore. if (!Files.exists(keystorePath))
throw new FileNotFoundException(keystorePath.toString());
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());
}
// Create a basic jetty server object without declaring the port. Since // Create a basic jetty server object without declaring the port. Since
// we are configuring connectors directly we'll be setting ports on // we are configuring connectors directly we'll be setting ports on
@ -67,7 +59,7 @@ public class ManyConnectors
// done. The port for secured communication is also set here. // done. The port for secured communication is also set here.
HttpConfiguration httpConfig = new HttpConfiguration(); HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.setSecureScheme("https"); httpConfig.setSecureScheme("https");
httpConfig.setSecurePort(8443); httpConfig.setSecurePort(securePort);
httpConfig.setOutputBufferSize(32768); httpConfig.setOutputBufferSize(32768);
// HTTP connector // HTTP connector
@ -77,7 +69,7 @@ public class ManyConnectors
// configure an idle timeout. // configure an idle timeout.
ServerConnector http = new ServerConnector(server, ServerConnector http = new ServerConnector(server,
new HttpConnectionFactory(httpConfig)); new HttpConnectionFactory(httpConfig));
http.setPort(8080); http.setPort(plainPort);
http.setIdleTimeout(30000); http.setIdleTimeout(30000);
// SSL Context Factory for HTTPS // SSL Context Factory for HTTPS
@ -88,7 +80,7 @@ public class ManyConnectors
// keystore to be used. // keystore to be used.
SslContextFactory sslContextFactory = new SslContextFactory.Server(); SslContextFactory sslContextFactory = new SslContextFactory.Server();
sslContextFactory.setKeyStorePath(keystoreFile.getAbsolutePath()); sslContextFactory.setKeyStorePath(keystorePath.toString());
sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"); sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g"); sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
@ -118,7 +110,7 @@ public class ManyConnectors
ServerConnector https = new ServerConnector(server, ServerConnector https = new ServerConnector(server,
new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()), new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
new HttpConnectionFactory(httpsConfig)); new HttpConnectionFactory(httpsConfig));
https.setPort(8443); https.setPort(securePort);
https.setIdleTimeout(500000); https.setIdleTimeout(500000);
// Here you see the server having multiple connectors registered with // Here you see the server having multiple connectors registered with
@ -132,7 +124,14 @@ public class ManyConnectors
// Set a handler // Set a handler
server.setHandler(new HelloHandler()); 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 // Start the server
server.start(); server.start();
server.dumpStdErr(); server.dumpStdErr();

View File

@ -18,39 +18,42 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.ContextHandlerCollection; import org.eclipse.jetty.server.handler.ContextHandlerCollection;
public class ManyContexts 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("/"); ContextHandler context = new ContextHandler("/");
context.setContextPath("/"); context.setContextPath("/");
context.setHandler(new HelloHandler("Root Hello")); context.setHandler(new HelloHandler("Root Hello"));
ContextHandler contextFR = new ContextHandler("/fr"); ContextHandler contextFR = new ContextHandler("/fr");
contextFR.setHandler(new HelloHandler("Bonjoir")); contextFR.setHandler(new HelloHandler("Bonjour"));
ContextHandler contextIT = new ContextHandler("/it"); ContextHandler contextIT = new ContextHandler("/it");
contextIT.setHandler(new HelloHandler("Bongiorno")); contextIT.setHandler(new HelloHandler("Buongiorno"));
ContextHandler contextV = new ContextHandler("/"); ContextHandler contextV = new ContextHandler("/");
contextV.setVirtualHosts(new String[]{"127.0.0.2"}); contextV.setVirtualHosts(new String[]{"127.0.0.2"});
contextV.setHandler(new HelloHandler("Virtual Hello")); contextV.setHandler(new HelloHandler("Virtual Hello"));
ContextHandlerCollection contexts = new ContextHandlerCollection(); ContextHandlerCollection contexts = new ContextHandlerCollection(
contexts.setHandlers(new Handler[]{ context, contextFR, contextIT, contextV
context, contextFR, contextIT, );
contextV
});
server.setHandler(contexts); 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.start();
server.dumpStdErr(); server.dumpStdErr();
server.join(); server.join();

View File

@ -30,6 +30,8 @@ import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.AbstractHandler; 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.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerCollection; import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.HandlerList;
@ -99,20 +101,23 @@ public class ManyHandlers
HttpServletResponse response) throws IOException, HttpServletResponse response) throws IOException,
ServletException ServletException
{ {
request.setAttribute("welcome", "Hello"); response.setHeader("X-Welcome", "Greetings from WelcomeWrapHandler");
super.handle(target, baseRequest, request, response); 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 // create the handlers
Handler param = new ParamHandler(); Handler param = new ParamHandler();
HandlerWrapper wrapper = new WelcomeWrapHandler(); HandlerWrapper wrapper = new WelcomeWrapHandler();
Handler hello = new HelloHandler(); 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 // configure request logging
File requestLogFile = File.createTempFile("demo", "log"); File requestLogFile = File.createTempFile("demo", "log");
@ -120,16 +125,47 @@ public class ManyHandlers
server.setRequestLog(ncsaLog); server.setRequestLog(ncsaLog);
// create the handler collections // create the handler collections
HandlerCollection handlers = new HandlerCollection(); HandlerList handlers = new HandlerList();
HandlerList list = new HandlerList();
// link them all together // wrap contexts around specific handlers
wrapper.setHandler(hello); wrapper.setHandler(hello);
list.setHandlers(new Handler[]{param, new GzipHandler()}); ContextHandler helloContext = new ContextHandler("/hello");
handlers.setHandlers(new Handler[]{list, dft}); 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); 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.start();
server.join(); server.join();
} }

View File

@ -29,9 +29,9 @@ import org.eclipse.jetty.servlet.ServletHolder;
public class ManyServletContexts 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 // Setup JMX
MBeanContainer mbContainer = new MBeanContainer( MBeanContainer mbContainer = new MBeanContainer(
@ -48,7 +48,7 @@ public class ManyServletContexts
// Add servlets to root context // Add servlets to root context
root.addServlet(new ServletHolder(new HelloServlet("Hello")), "/"); root.addServlet(new ServletHolder(new HelloServlet("Hello")), "/");
root.addServlet(new ServletHolder(new HelloServlet("Ciao")), "/it/*"); 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 // Configure context "/other" for servlets
ServletContextHandler other = new ServletContextHandler(contexts, ServletContextHandler other = new ServletContextHandler(contexts,
@ -57,6 +57,13 @@ public class ManyServletContexts
other.addServlet(DefaultServlet.class.getCanonicalName(), "/"); other.addServlet(DefaultServlet.class.getCanonicalName(), "/");
other.addServlet(new ServletHolder(new HelloServlet("YO!")), "*.yo"); 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.start();
server.dumpStdErr(); server.dumpStdErr();
server.join(); server.join();

View File

@ -19,7 +19,6 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.IOException; import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@ -29,13 +28,13 @@ import org.eclipse.jetty.servlet.ServletHandler;
public class MinimalServlets 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 // 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, // will be assigned that you can either look in the logs for the port,
// or programmatically obtain it for use in test cases. // 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 // The ServletHandler is a dead simple way to create a context handler
// that is backed by an instance of a Servlet. // that is backed by an instance of a Servlet.
@ -51,13 +50,20 @@ public class MinimalServlets
// through a web.xml @WebServlet annotation, or anything similar. // through a web.xml @WebServlet annotation, or anything similar.
handler.addServletWithMapping(HelloServlet.class, "/*"); 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! // Start things up!
server.start(); server.start();
// The use of server.join() the will make the current thread join and // The use of server.join() the will make the current thread join and
// wait until the server is done executing. // wait until the server thread is done executing.
// See
// http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()
server.join(); server.join();
} }
@ -66,11 +72,11 @@ public class MinimalServlets
{ {
@Override @Override
protected void doGet(HttpServletRequest request, protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, HttpServletResponse response) throws IOException
IOException
{ {
response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK); response.setStatus(HttpServletResponse.SC_OK);
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
response.getWriter().println("<h1>Hello from HelloServlet</h1>"); response.getWriter().println("<h1>Hello from HelloServlet</h1>");
} }
} }

View File

@ -26,7 +26,7 @@ import org.eclipse.jetty.server.ServerConnector;
*/ */
public class OneConnector public class OneConnector
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port) throws Exception
{ {
// The Server // The Server
Server server = new Server(); Server server = new Server();
@ -34,7 +34,7 @@ public class OneConnector
// HTTP connector // HTTP connector
ServerConnector http = new ServerConnector(server); ServerConnector http = new ServerConnector(server);
http.setHost("localhost"); http.setHost("localhost");
http.setPort(8080); http.setPort(port);
http.setIdleTimeout(30000); http.setIdleTimeout(30000);
// Set the connector // Set the connector
@ -42,6 +42,13 @@ public class OneConnector
// Set a handler // Set a handler
server.setHandler(new HelloHandler()); 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 // Start the server
server.start(); server.start();

View File

@ -23,9 +23,9 @@ import org.eclipse.jetty.server.handler.ContextHandler;
public class OneContext 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" // Add a single handler on context "/hello"
ContextHandler context = new ContextHandler(); ContextHandler context = new ContextHandler();
@ -35,6 +35,13 @@ public class OneContext
// Can be accessed using http://localhost:8080/hello // Can be accessed using http://localhost:8080/hello
server.setHandler(context); 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 // Start the server
server.start(); server.start();

View File

@ -22,11 +22,17 @@ import org.eclipse.jetty.server.Server;
public class OneHandler public class OneHandler
{ {
public static Server createServer(int port)
{
Server server = new Server(port);
server.setHandler(new HelloHandler());
return server;
}
public static void main(String[] args) throws Exception public static void main(String[] args) throws Exception
{ {
Server server = new Server(8080); int port = ExampleUtil.getPort(args, "jetty.http.port", 8080);
server.setHandler(new HelloHandler()); Server server = createServer(port);
server.start(); server.start();
server.join(); server.join();
} }

View File

@ -19,8 +19,9 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.EnumSet; import java.util.EnumSet;
import javax.servlet.DispatcherType;
import javax.servlet.Filter; import javax.servlet.Filter;
import javax.servlet.FilterChain; import javax.servlet.FilterChain;
import javax.servlet.FilterConfig; import javax.servlet.FilterConfig;
@ -31,38 +32,59 @@ import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener; import javax.servlet.ServletRequestListener;
import javax.servlet.ServletResponse; import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.DefaultServlet; import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ListenerHolder; import org.eclipse.jetty.servlet.ListenerHolder;
import org.eclipse.jetty.servlet.ServletContextHandler; 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 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 context = new ServletContextHandler(ServletContextHandler.SESSIONS);
ServletContextHandler.SESSIONS);
context.setContextPath("/"); context.setContextPath("/");
context.setResourceBase(System.getProperty("java.io.tmpdir")); context.setBaseResource(baseResource);
server.setHandler(context); server.setHandler(context);
// Add dump servlet // add hello servlet
context.addServlet(
context.addServlet(DumpServlet.class, "/dump/*"),
"*.dump");
context.addServlet(HelloServlet.class, "/hello/*"); 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.addServlet(DefaultServlet.class, "/");
context.addFilter(TestFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); // sprinkle in a few filters to demonstrate behaviors
context.addFilter(TestFilter.class, "/test", EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC)); context.addFilter(TestFilter.class, "/test/*", EnumSet.of(REQUEST));
context.addFilter(TestFilter.class, "*.test", EnumSet.of(DispatcherType.REQUEST, DispatcherType.INCLUDE, DispatcherType.FORWARD)); 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(InitListener.class));
context.getServletHandler().addListener(new ListenerHolder(RequestListener.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.start();
server.dumpStdErr(); server.dumpStdErr();
server.join(); server.join();
@ -71,14 +93,18 @@ public class OneServletContext
public static class TestFilter implements Filter public static class TestFilter implements Filter
{ {
@Override @Override
public void init(FilterConfig filterConfig) throws ServletException public void init(FilterConfig filterConfig)
{ {
} }
@Override @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 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); chain.doFilter(request, response);
} }
@ -94,6 +120,7 @@ public class OneServletContext
@Override @Override
public void contextInitialized(ServletContextEvent sce) public void contextInitialized(ServletContextEvent sce)
{ {
sce.getServletContext().setAttribute("X-Init", "true");
} }
@Override @Override
@ -105,15 +132,14 @@ public class OneServletContext
public static class RequestListener implements ServletRequestListener public static class RequestListener implements ServletRequestListener
{ {
@Override @Override
public void requestDestroyed(ServletRequestEvent sre) public void requestInitialized(ServletRequestEvent sre)
{ {
sre.getServletRequest().setAttribute("X-ReqListener", "true");
} }
@Override @Override
public void requestInitialized(ServletRequestEvent sre) public void requestDestroyed(ServletRequestEvent sre)
{ {
} }
} }
} }

View File

@ -28,9 +28,10 @@ import org.eclipse.jetty.servlet.ServletContextHandler;
public class OneServletContextJmxStats 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 // Add JMX tracking to Server
server.addBean(new MBeanContainer(ManagementFactory server.addBean(new MBeanContainer(ManagementFactory
.getPlatformMBeanServer())); .getPlatformMBeanServer()));
@ -45,6 +46,13 @@ public class OneServletContextJmxStats
// Add Connector Statistics tracking to all connectors // Add Connector Statistics tracking to all connectors
ServerConnectionStatistics.addToAllConnectors(server); 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.start();
server.join(); server.join();

View File

@ -18,24 +18,29 @@
package org.eclipse.jetty.embedded; 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.Server;
import org.eclipse.jetty.server.session.DefaultSessionCache; import org.eclipse.jetty.server.session.DefaultSessionCache;
import org.eclipse.jetty.server.session.NullSessionDataStore; import org.eclipse.jetty.server.session.NullSessionDataStore;
import org.eclipse.jetty.server.session.SessionCache; import org.eclipse.jetty.server.session.SessionCache;
import org.eclipse.jetty.server.session.SessionHandler; import org.eclipse.jetty.server.session.SessionHandler;
import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.util.resource.PathResource;
import org.eclipse.jetty.util.resource.Resource;
public class OneServletContextWithSession 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. // Create a ServletContext, with a session handler enabled.
ServletContextHandler context = new ServletContextHandler( ServletContextHandler context = new ServletContextHandler(
ServletContextHandler.SESSIONS); ServletContextHandler.SESSIONS);
context.setContextPath("/"); context.setContextPath("/");
context.setResourceBase(System.getProperty("java.io.tmpdir")); context.setBaseResource(baseResource);
server.setHandler(context); server.setHandler(context);
// Access the SessionHandler from the context. // Access the SessionHandler from the context.
@ -55,6 +60,15 @@ public class OneServletContextWithSession
// Servlet to read/set the greeting stored in the session. // Servlet to read/set the greeting stored in the session.
// Can be accessed using http://localhost:8080/hello // Can be accessed using http://localhost:8080/hello
context.addServlet(HelloSessionServlet.class, "/"); 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.start();
server.dumpStdErr(); server.dumpStdErr();

View File

@ -19,26 +19,19 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.File; 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.server.Server;
import org.eclipse.jetty.webapp.WebAppContext; import org.eclipse.jetty.webapp.WebAppContext;
public class OneWebApp 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. // 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 // 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, // will be assigned that you can either look in the logs for the port,
// or programmatically obtain it for use in test cases. // or programmatically obtain it for use in test cases.
Server server = new Server(8080); Server server = new Server(port);
// Setup JMX
MBeanContainer mbContainer = new MBeanContainer(
ManagementFactory.getPlatformMBeanServer());
server.addBean(mbContainer);
// The WebAppContext is the entity that controls the environment in // The WebAppContext is the entity that controls the environment in
// which a web application lives and breathes. In this example the // which a web application lives and breathes. In this example the
@ -55,6 +48,13 @@ public class OneWebApp
// A WebAppContext is a ContextHandler as well so it needs to be set to // 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. // the server so it is aware of where to send the appropriate requests.
server.setHandler(webapp); 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! // Start things up!
server.start(); server.start();
@ -63,7 +63,6 @@ public class OneWebApp
// The use of server.join() the will make the current thread join and // The use of server.join() the will make the current thread join and
// wait until the server is done executing. // wait until the server is done executing.
// See http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()
server.join(); server.join();
} }
} }

View File

@ -18,49 +18,45 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.File; import java.io.FileNotFoundException;
import java.lang.management.ManagementFactory; 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.security.HashLoginService;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.resource.PathResource;
import org.eclipse.jetty.webapp.Configuration; import org.eclipse.jetty.webapp.Configuration;
import org.eclipse.jetty.webapp.WebAppContext; import org.eclipse.jetty.webapp.WebAppContext;
public class OneWebAppWithJsp 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. // Create a basic jetty server object that will listen on port 8080.
// Note that if you set this to port 0 then // Note that if you set this to port 0 then
// a randomly available port will be assigned that you can either look // a randomly available port will be assigned that you can either look
// in the logs for the port, // in the logs for the port,
// or programmatically obtain it for use in test cases. // or programmatically obtain it for use in test cases.
Server server = new Server(8080); Server server = new Server(port);
// Setup JMX
MBeanContainer mbContainer = new MBeanContainer(
ManagementFactory.getPlatformMBeanServer());
server.addBean(mbContainer);
// The WebAppContext is the entity that controls the environment in // The WebAppContext is the entity that controls the environment in
// which a web application lives and // which a web application lives and breathes.
// breathes. In this example the context path is being set to "/" so it // In this example the context path is being set to "/" so it
// is suitable for serving root context // is suitable for serving root context
// requests and then we see it setting the location of the war. A whole // requests and then we see it setting the location of the war.
// host of other configurations are // A whole host of other configurations are
// available, ranging from configuring to support annotation scanning in // available, ranging from configuring to support annotation scanning in
// the webapp (through // the webapp (through PlusConfiguration), to choosing where
// PlusConfiguration) to choosing where the webapp will unpack itself. // the webapp will unpack itself.
WebAppContext webapp = new WebAppContext(); WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/"); webapp.setContextPath("/");
File warFile = new File( Path warFile = JettyDistribution.resolve("demo-base/webapps/test.war");
"jetty-distribution/target/distribution/demo-base/webapps/test.war"); if (!Files.exists(warFile))
if (!warFile.exists())
{ {
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); webapp.setExtractWAR(true);
// This webapp will use jsps and jstl. We need to enable the // This webapp will use jsps and jstl. We need to enable the
@ -93,11 +89,25 @@ public class OneWebAppWithJsp
// its own we register it as a bean with the Jetty server object so it // 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 // can be started and stopped according to the lifecycle of the server
// itself. // 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(); HashLoginService loginService = new HashLoginService();
loginService.setName("Test Realm"); loginService.setName("Test Realm");
loginService.setConfig("examples/embedded/src/test/resources/realm.properties"); loginService.setConfig(realmProps.toExternalForm());
server.addBean(loginService); 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! // Start things up!
server.start(); server.start();
@ -105,7 +115,6 @@ public class OneWebAppWithJsp
// The use of server.join() the will make the current thread join and // The use of server.join() the will make the current thread join and
// wait until the server is done executing. // wait until the server is done executing.
// See http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()
server.join(); server.join();
} }
} }

View File

@ -27,11 +27,13 @@ import org.eclipse.jetty.servlet.ServletHolder;
public class ProxyServer public class ProxyServer
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port)
{ {
Server server = new Server(); Server server = new Server();
// Establish listening connector
ServerConnector connector = new ServerConnector(server); ServerConnector connector = new ServerConnector(server);
connector.setPort(8888); connector.setPort(port);
server.addConnector(connector); server.addConnector(connector);
// Setup proxy handler to handle CONNECT methods // Setup proxy handler to handle CONNECT methods
@ -45,6 +47,15 @@ public class ProxyServer
proxyServlet.setInitParameter("blackList", "www.eclipse.org"); proxyServlet.setInitParameter("blackList", "www.eclipse.org");
context.addServlet(proxyServlet, "/*"); 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.start();
server.join();
} }
} }

View File

@ -18,27 +18,29 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.util.Arrays;
import org.eclipse.jetty.rewrite.RewriteCustomizer; import org.eclipse.jetty.rewrite.RewriteCustomizer;
import org.eclipse.jetty.rewrite.handler.CompactPathRule; import org.eclipse.jetty.rewrite.handler.CompactPathRule;
import org.eclipse.jetty.rewrite.handler.RewriteRegexRule; import org.eclipse.jetty.rewrite.handler.RewriteRegexRule;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletContextHandler;
public class RewriteServer public class RewriteServer
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port)
{ {
Server server = new Server(8080); Server server = new Server(port);
HttpConfiguration config = server.getConnectors()[0].getConnectionFactory(HttpConnectionFactory.class).getHttpConfiguration();
RewriteCustomizer rewrite = new RewriteCustomizer(); RewriteCustomizer rewrite = new RewriteCustomizer();
config.addCustomizer(rewrite);
rewrite.addRule(new CompactPathRule()); rewrite.addRule(new CompactPathRule());
rewrite.addRule(new RewriteRegexRule("(.*)foo(.*)", "$1FOO$2")); 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 context = new ServletContextHandler(
ServletContextHandler.SESSIONS); ServletContextHandler.SESSIONS);
context.setContextPath("/"); context.setContextPath("/");
@ -46,6 +48,14 @@ public class RewriteServer
context.addServlet(DumpServlet.class, "/*"); 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.start();
server.join(); server.join();
} }

View File

@ -18,6 +18,8 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.FileNotFoundException;
import java.net.URL;
import java.util.Collections; import java.util.Collections;
import org.eclipse.jetty.security.ConstraintMapping; import org.eclipse.jetty.security.ConstraintMapping;
@ -30,13 +32,13 @@ import org.eclipse.jetty.util.security.Constraint;
public class SecuredHelloHandler 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. // 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 // 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, // will be assigned that you can either look in the logs for the port,
// or programmatically obtain it for use in test cases. // 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 // 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 // LoginService so this shows how to create a very simple hashmap based
@ -46,8 +48,14 @@ public class SecuredHelloHandler
// started and stopped according to the lifecycle of the server itself. // 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 // In this example the name can be whatever you like since we are not
// dealing with webapp realms. // 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", LoginService loginService = new HashLoginService("MyRealm",
"src/test/resources/realm.properties"); realmProps.toExternalForm());
server.addBean(loginService); server.addBean(loginService);
// A security handler is a jetty handler that secures content behind a // A security handler is a jetty handler that secures content behind a
@ -68,7 +76,7 @@ public class SecuredHelloHandler
constraint.setRoles(new String[]{"user", "admin"}); constraint.setRoles(new String[]{"user", "admin"});
// Binds a url pattern with the previously created constraint. The roles // 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. // although methods exist to declare and bind roles separately as well.
ConstraintMapping mapping = new ConstraintMapping(); ConstraintMapping mapping = new ConstraintMapping();
mapping.setPathSpec("/*"); mapping.setPathSpec("/*");
@ -92,13 +100,19 @@ public class SecuredHelloHandler
// chain the hello handler into the security handler // chain the hello handler into the security handler
security.setHandler(hh); 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! // Start things up!
server.start(); server.start();
// The use of server.join() the will make the current thread join and // The use of server.join() the will make the current thread join and
// wait until the server is done executing. // wait until the server is done executing.
// See
// http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()
server.join(); server.join();
} }
} }

View File

@ -19,6 +19,9 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.File; 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.EnvEntry;
import org.eclipse.jetty.plus.jndi.NamingDump; import org.eclipse.jetty.plus.jndi.NamingDump;
@ -34,10 +37,10 @@ import org.eclipse.jetty.webapp.WebAppContext;
*/ */
public class ServerWithAnnotations public class ServerWithAnnotations
{ {
public static final void main(String[] args) throws Exception public static Server createServer(int port) throws NamingException, FileNotFoundException
{ {
// Create the server // 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 // Enable parsing of jndi-related parts of web.xml and jetty-env.xml
Configuration.ClassList classlist = Configuration.ClassList Configuration.ClassList classlist = Configuration.ClassList
@ -63,7 +66,7 @@ public class ServerWithAnnotations
new Transaction(new com.acme.MockUserTransaction()); new Transaction(new com.acme.MockUserTransaction());
// Define an env entry with webapp scope. // 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); new EnvEntry(webapp, "maxAmount", 100d, true);
// Register a mock DataSource scoped to the webapp // Register a mock DataSource scoped to the webapp
@ -73,10 +76,23 @@ public class ServerWithAnnotations
server.addBean(new NamingDump()); server.addBean(new NamingDump());
// Configure a LoginService // 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(); HashLoginService loginService = new HashLoginService();
loginService.setName("Test Realm"); loginService.setName("Test Realm");
loginService.setConfig("examples/embedded/src/test/resources/realm.properties"); loginService.setConfig(realmProps.toExternalForm());
server.addBean(loginService); 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.start();
server.dumpStdErr(); server.dumpStdErr();

View File

@ -19,6 +19,7 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
import java.net.MalformedURLException;
import javax.management.remote.JMXServiceURL; import javax.management.remote.JMXServiceURL;
import org.eclipse.jetty.jmx.ConnectorServer; import org.eclipse.jetty.jmx.ConnectorServer;
@ -26,17 +27,16 @@ import org.eclipse.jetty.jmx.MBeanContainer;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
/** /**
* The simplest possible Jetty server. * A Jetty Server with JMX enabled for remote connections
*/ */
public class ServerWithJMX 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( MBeanContainer mbContainer = new MBeanContainer(
ManagementFactory.getPlatformMBeanServer()); ManagementFactory.getPlatformMBeanServer());
Server server = new Server(8080);
server.addBean(mbContainer); server.addBean(mbContainer);
ConnectorServer jmx = new ConnectorServer( ConnectorServer jmx = new ConnectorServer(
@ -48,6 +48,14 @@ public class ServerWithJMX
"org.eclipse.jetty.jmx:name=rmiconnectorserver"); "org.eclipse.jetty.jmx:name=rmiconnectorserver");
server.addBean(jmx); 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.start();
server.dumpStdErr(); server.dumpStdErr();
server.join(); server.join();

View File

@ -18,10 +18,12 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.File; import java.nio.file.Path;
import java.util.Properties; import java.util.Properties;
import javax.naming.NamingException;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.resource.PathResource;
import org.eclipse.jetty.webapp.Configuration; import org.eclipse.jetty.webapp.Configuration;
import org.eclipse.jetty.webapp.WebAppContext; import org.eclipse.jetty.webapp.WebAppContext;
@ -30,11 +32,10 @@ import org.eclipse.jetty.webapp.WebAppContext;
*/ */
public class ServerWithJNDI public class ServerWithJNDI
{ {
public static void main(String[] args) throws Exception public static Server createServer(int port) throws NamingException
{ {
// Create the server // 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 // Enable parsing of jndi-related parts of web.xml and jetty-env.xml
Configuration.ClassList classlist = Configuration.ClassList Configuration.ClassList classlist = Configuration.ClassList
@ -46,9 +47,8 @@ public class ServerWithJNDI
// Create a WebApp // Create a WebApp
WebAppContext webapp = new WebAppContext(); WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/"); webapp.setContextPath("/");
File warFile = new File( Path testJndiWar = JettyDistribution.resolve("demo-base/webapps/test-jndi.war");
"../../jetty-distribution/target/distribution/demo-base/webapps/test-jndi.war"); webapp.setWarResource(new PathResource(testJndiWar));
webapp.setWar(warFile.getAbsolutePath());
server.setHandler(webapp); server.setHandler(webapp);
// Register new transaction manager in JNDI // Register new transaction manager in JNDI
@ -64,7 +64,7 @@ public class ServerWithJNDI
// <env-entry-type>java.lang.Integer</env-entry-type> // <env-entry-type>java.lang.Integer</env-entry-type>
// <env-entry-value>4000</env-entry-value> // <env-entry-value>4000</env-entry-value>
// </env-entry> // </env-entry>
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. // Define an env entry with webapp scope.
// At runtime, the webapp accesses this as java:comp/env/wiggle // At runtime, the webapp accesses this as java:comp/env/wiggle
@ -77,7 +77,7 @@ public class ServerWithJNDI
// Note that the last arg of "true" means that this definition for // Note that the last arg of "true" means that this definition for
// "wiggle" would override an entry of the // "wiggle" would override an entry of the
// same name in web.xml // 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. // Register a reference to a mail service scoped to the webapp.
// This must be linked to the webapp by an entry in web.xml: // This must be linked to the webapp by an entry in web.xml:
@ -87,7 +87,8 @@ public class ServerWithJNDI
// <res-auth>Container</res-auth> // <res-auth>Container</res-auth>
// </resource-ref> // </resource-ref>
// At runtime the webapp accesses this as java:comp/env/mail/Session // 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.setUser("CHANGE-ME");
mailref.setPassword("CHANGE-ME"); mailref.setPassword("CHANGE-ME");
Properties props = new Properties(); Properties props = new Properties();
@ -109,6 +110,13 @@ public class ServerWithJNDI
// java:comp/env/jdbc/mydatasource // java:comp/env/jdbc/mydatasource
new org.eclipse.jetty.plus.jndi.Resource( new org.eclipse.jetty.plus.jndi.Resource(
webapp, "jdbc/mydatasource", new com.acme.MockDataSource()); 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.start();
server.join(); server.join();

View File

@ -25,11 +25,20 @@ import org.eclipse.jetty.server.Server;
*/ */
public class SimplestServer 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 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.start();
server.dumpStdErr();
server.join(); server.join();
} }
} }

View File

@ -18,16 +18,14 @@
package org.eclipse.jetty.embedded; 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.Server;
import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.ContextHandlerCollection; import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.server.handler.ResourceHandler; 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; import org.eclipse.jetty.util.resource.Resource;
/** /**
@ -37,59 +35,68 @@ import org.eclipse.jetty.util.resource.Resource;
*/ */
public class SplitFileServer 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 // Create the Server object and a corresponding ServerConnector and then
// set the port for the connector. In this example the server will // 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 // has been started you can called connector.getLocalPort() to
// programmatically get the port the server started on. // programmatically get the port the server started on.
Server server = new Server(); Server server = new Server();
ServerConnector connector = new ServerConnector(server); ServerConnector connector = new ServerConnector(server);
connector.setPort(8090); connector.setPort(port);
server.setConnectors(new Connector[]{connector}); server.addConnector(connector);
// Create a Context Handler and ResourceHandler. The ContextHandler is // Create a Context Handler and ResourceHandler. The ContextHandler is
// getting set to "/" path but this could be anything you like for // 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 // our jetty maven testing utilities to get the proper resource
// directory, you needn't use these, you simply need to supply the paths // directory, you needn't use these, you simply need to supply the paths
// you are looking to serve content from. // you are looking to serve content from.
ResourceHandler rh0 = new ResourceHandler(); ResourceHandler rh0 = new ResourceHandler();
rh0.setDirectoriesListed(false);
ContextHandler context0 = new ContextHandler(); ContextHandler context0 = new ContextHandler();
context0.setContextPath("/"); context0.setContextPath("/");
File dir0 = MavenTestingUtils.getTestResourceDir("dir0"); context0.setBaseResource(baseResource0);
context0.setBaseResource(Resource.newResource(dir0));
context0.setHandler(rh0); context0.setHandler(rh0);
// Rinse and repeat the previous item, only specifying a different // Rinse and repeat the previous item, only specifying a different
// resource base. // resource base.
ResourceHandler rh1 = new ResourceHandler(); ResourceHandler rh1 = new ResourceHandler();
rh1.setDirectoriesListed(false);
ContextHandler context1 = new ContextHandler(); ContextHandler context1 = new ContextHandler();
context1.setContextPath("/"); context1.setContextPath("/");
File dir1 = MavenTestingUtils.getTestResourceDir("dir1"); context1.setBaseResource(baseResource1);
context1.setBaseResource(Resource.newResource(dir1));
context1.setHandler(rh1); context1.setHandler(rh1);
// Create a ContextHandlerCollection and set the context handlers to it. // Create a ContextHandlerCollection and set the context handlers to it.
// This will let jetty process urls against the declared contexts in // This will let jetty process urls against the declared contexts in
// order to match up content. // order to match up content.
ContextHandlerCollection contexts = new ContextHandlerCollection(); ContextHandlerCollection contexts = new ContextHandlerCollection(
contexts.setHandlers(new Handler[]{context0, context1}); context0, context1
);
server.setHandler(contexts); server.setHandler(contexts);
return server;
}
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
server.setDumpAfterStart(true);
// Start things up! // Start things up!
server.start(); server.start();
// Dump the server state
System.out.println(server.dump());
// The use of server.join() the will make the current thread join and // The use of server.join() the will make the current thread join and
// wait until the server is done executing. // wait until the server is done executing.
// See http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()
server.join(); server.join();
} }
} }

View File

@ -26,7 +26,6 @@ import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.DefaultHandler; import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.websocket.jsr356.server.ServerContainer;
import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer; import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer;
/** /**
@ -47,29 +46,38 @@ public class WebSocketJsrServer
} }
} }
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(); HandlerList handlers = new HandlerList();
ServletContextHandler context = new ServletContextHandler( ServletContextHandler context = new ServletContextHandler();
ServletContextHandler.SESSIONS);
context.setContextPath("/"); context.setContextPath("/");
handlers.addHandler(context); handlers.addHandler(context);
// Enable javax.websocket configuration for the context // Enable javax.websocket configuration for the context
ServerContainer wsContainer = WebSocketServerContainerInitializer WebSocketServerContainerInitializer.configure(context,
.configureContext(context); (servletContext, serverContainer) ->
{
// Add your websockets to the container // Add your websocket to the javax.websocket.server.ServerContainer
wsContainer.addEndpoint(EchoJsrSocket.class); serverContainer.addEndpoint(EchoJsrSocket.class);
}
);
handlers.addHandler(new DefaultHandler()); handlers.addHandler(new DefaultHandler());
server.setHandler(handlers); 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.start();
context.dumpStdErr();
server.join(); server.join();
} }
} }

View File

@ -20,7 +20,6 @@ package org.eclipse.jetty.embedded;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler; 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.Session;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
import org.eclipse.jetty.websocket.api.annotations.WebSocket; import org.eclipse.jetty.websocket.api.annotations.WebSocket;
@ -61,20 +60,25 @@ public class WebSocketServer
} }
} }
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 context = new ServletContextHandler();
ServletContextHandler.SESSIONS);
context.setContextPath("/"); context.setContextPath("/");
server.setHandler(context); server.setHandler(context);
// Add the echo socket servlet to the /echo path map // 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(); server.start();
context.dumpStdErr();
server.join(); server.join();
} }
} }

Binary file not shown.

View File

@ -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: <No 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-----

View File

@ -0,0 +1,20 @@
#
# This file defines users passwords and roles for a HashUserRealm
#
# The format is
# <username>: <password>[,<rolename> ...]
#
# 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

View File

@ -7,7 +7,9 @@
<Item> <Item>
<New class="org.eclipse.jetty.server.ServerConnector"> <New class="org.eclipse.jetty.server.ServerConnector">
<Arg><Ref refid="ExampleServer"/></Arg> <Arg><Ref refid="ExampleServer"/></Arg>
<Set name="port">8080</Set> <Set name="port">
<Property name="http.port" default="8080" />
</Set>
</New> </New>
</Item> </Item>
</Array> </Array>

View File

@ -7,7 +7,9 @@
<Arg> <Arg>
<New class="org.eclipse.jetty.server.ServerConnector"> <New class="org.eclipse.jetty.server.ServerConnector">
<Arg><Ref refid="FileServer"/></Arg> <Arg><Ref refid="FileServer"/></Arg>
<Set name="port">8080</Set> <Set name="port">
<Property name="http.port" default="8080" />
</Set>
</New> </New>
</Arg> </Arg>
</Call> </Call>
@ -22,7 +24,9 @@
<Set name="welcomeFiles"> <Set name="welcomeFiles">
<Array type="String"><Item>index.html</Item></Array> <Array type="String"><Item>index.html</Item></Array>
</Set> </Set>
<Set name="resourceBase">.</Set> <Set name="resourceBase">
<Property name="fileserver.baseresource" default="." />
</Set>
</New> </New>
</Item> </Item>
<Item> <Item>

View File

@ -0,0 +1,50 @@
//
// ========================================================================
// 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.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 abstract class AbstractEmbeddedTest
{
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.out.printf("%s %s %s%n", response.getVersion(), response.getStatus(), response.getReason());
System.out.println(response.getHeaders());
}
}

View File

@ -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));
}
}

View File

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

View File

@ -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));
}
}

View File

@ -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));
}
}

View File

@ -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));
}
}

View File

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

View File

@ -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<String, Integer> 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"));
}
}

View File

@ -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<String, Integer> 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"));
}
}

View File

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

View File

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

View File

@ -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!"));
}
}

View File

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

View File

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

View File

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

View File

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

View File

@ -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<ObjectName> 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));
}
}

View File

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

View File

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

View File

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

View File

@ -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:&nbsp;</th><td>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("<td>" + userAgent + "</td>"));
}
@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("<h1>JSTL Example</h1>"));
for (int i = 1; i <= 10; i++)
{
assertThat("Reponse content (counting)", responseBody, containsString("" + i));
}
}
}

View File

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

View File

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

View File

@ -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("<h1>Hello World</h1>"));
}
}

View File

@ -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<String, Integer> 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<String, Integer> ports = new HashMap<>();
ports.put("plain", plainHttpPort);
ports.put("secure", secureHttpPort);
return ports;
}
}

View File

@ -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("<span class=\"fail\">")));
}
}

View File

@ -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<ObjectName> mbeanNames = mbeanServer.queryNames(ObjectName.getInstance(name), null);
Optional<ObjectName> rmiConnectorNameOptional = mbeanNames.stream().findFirst();
assertTrue(rmiConnectorNameOptional.isPresent(), "Has RMI Connector Server");
}
}

View File

@ -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("<span class=\"fail\">")));
}
}

View File

@ -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));
}
}

View File

@ -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));
}
}

View File

@ -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<String>
{
public LinkedBlockingQueue<String> 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);
}
}
}

View File

@ -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<Session> 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<String> 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);
}
}
}

View File

@ -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

View File

@ -173,7 +173,7 @@ public class TestSecurityAnnotationConversions
public void testMethodAnnotation() throws Exception public void testMethodAnnotation() throws Exception
{ {
//ServletSecurity annotation with HttpConstraint of TransportGuarantee.CONFIDENTIAL, and a list of rolesAllowed, and //ServletSecurity annotation with HttpConstraint of TransportGuarantee.CONFIDENTIAL, and a list of rolesAllowed, and
//a HttpMethodConstraint for GET method that permits all and has TransportGuarantee.NONE (ie is default) //an HttpMethodConstraint for GET method that permits all and has TransportGuarantee.NONE (ie is default)
WebAppContext wac = makeWebAppContext(Method1Servlet.class.getCanonicalName(), "method1Servlet", new String[]{ WebAppContext wac = makeWebAppContext(Method1Servlet.class.getCanonicalName(), "method1Servlet", new String[]{
"/foo/*", "*.foo" "/foo/*", "*.foo"

View File

@ -299,6 +299,11 @@
<artifactId>jetty-security</artifactId> <artifactId>jetty-security</artifactId>
<version>9.4.21-SNAPSHOT</version> <version>9.4.21-SNAPSHOT</version>
</dependency> </dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-openid</artifactId>
<version>9.4.21-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId> <artifactId>jetty-server</artifactId>

View File

@ -28,7 +28,7 @@ import org.eclipse.jetty.io.ClientConnectionFactory;
* in order to plug-in a different transport for {@link HttpClient}. * in order to plug-in a different transport for {@link HttpClient}.
* <p> * <p>
* While the {@link HttpClient} APIs define the HTTP semantic (request, response, headers, etc.) * While the {@link HttpClient} APIs define the HTTP semantic (request, response, headers, etc.)
* <em>how</em> a HTTP exchange is carried over the network depends on implementations of this class. * <em>how</em> an HTTP exchange is carried over the network depends on implementations of this class.
* <p> * <p>
* The default implementation uses the HTTP protocol to carry over the network the HTTP exchange, * The default implementation uses the HTTP protocol to carry over the network the HTTP exchange,
* but the HTTP exchange may also be carried using the FCGI protocol, the HTTP/2 protocol or, * but the HTTP exchange may also be carried using the FCGI protocol, the HTTP/2 protocol or,

View File

@ -32,7 +32,7 @@ import org.eclipse.jetty.util.log.Logger;
/** /**
* {@link HttpContent} is a stateful, linear representation of the request content provided * {@link HttpContent} is a stateful, linear representation of the request content provided
* by a {@link ContentProvider} that can be traversed one-way to obtain content buffers to * by a {@link ContentProvider} that can be traversed one-way to obtain content buffers to
* send to a HTTP server. * send to an HTTP server.
* <p> * <p>
* {@link HttpContent} offers the notion of a one-way cursor to traverse the content. * {@link HttpContent} offers the notion of a one-way cursor to traverse the content.
* The cursor starts in a virtual "before" position and can be advanced using {@link #advance()} * The cursor starts in a virtual "before" position and can be advanced using {@link #advance()}

View File

@ -51,7 +51,7 @@ import org.eclipse.jetty.util.log.Logger;
* <ol> * <ol>
* <li>{@link #responseBegin(HttpExchange)}, when the HTTP response data containing the HTTP status code * <li>{@link #responseBegin(HttpExchange)}, when the HTTP response data containing the HTTP status code
* is available</li> * is available</li>
* <li>{@link #responseHeader(HttpExchange, HttpField)}, when a HTTP field is available</li> * <li>{@link #responseHeader(HttpExchange, HttpField)}, when an HTTP field is available</li>
* <li>{@link #responseHeaders(HttpExchange)}, when all HTTP headers are available</li> * <li>{@link #responseHeaders(HttpExchange)}, when all HTTP headers are available</li>
* <li>{@link #responseContent(HttpExchange, ByteBuffer, Callback)}, when HTTP content is available</li> * <li>{@link #responseContent(HttpExchange, ByteBuffer, Callback)}, when HTTP content is available</li>
* <li>{@link #responseSuccess(HttpExchange)}, when the response is successful</li> * <li>{@link #responseSuccess(HttpExchange)}, when the response is successful</li>

View File

@ -82,7 +82,7 @@ public class HttpRedirector
/** /**
* @param response the response to check for redirects * @param response the response to check for redirects
* @return whether the response code is a HTTP redirect code * @return whether the response code is an HTTP redirect code
*/ */
public boolean isRedirect(Response response) public boolean isRedirect(Response response)
{ {

View File

@ -869,7 +869,7 @@ public class HttpRequest implements Request
} }
catch (URISyntaxException x) catch (URISyntaxException x)
{ {
// The "path" of a HTTP request may not be a URI, // The "path" of an HTTP request may not be a URI,
// for example for CONNECT 127.0.0.1:8080. // for example for CONNECT 127.0.0.1:8080.
return null; return null;
} }

View File

@ -40,7 +40,7 @@ import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.util.Fields; import org.eclipse.jetty.util.Fields;
/** /**
* <p>{@link Request} represents a HTTP request, and offers a fluent interface to customize * <p>{@link Request} represents an HTTP request, and offers a fluent interface to customize
* various attributes such as the path, the headers, the content, etc.</p> * various attributes such as the path, the headers, the content, etc.</p>
* <p>You can create {@link Request} objects via {@link HttpClient#newRequest(String)} and * <p>You can create {@link Request} objects via {@link HttpClient#newRequest(String)} and
* you can send them using either {@link #send()} for a blocking semantic, or * you can send them using either {@link #send()} for a blocking semantic, or

View File

@ -29,7 +29,7 @@ import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.Callback;
/** /**
* <p>{@link Response} represents a HTTP response and offers methods to retrieve status code, HTTP version * <p>{@link Response} represents an HTTP response and offers methods to retrieve status code, HTTP version
* and headers.</p> * and headers.</p>
* <p>{@link Response} objects are passed as parameters to {@link Response.Listener} callbacks, or as * <p>{@link Response} objects are passed as parameters to {@link Response.Listener} callbacks, or as
* future result of {@link Request#send()}.</p> * future result of {@link Request#send()}.</p>

View File

@ -161,7 +161,7 @@ public class HttpReceiverOverHTTP extends HttpReceiver implements HttpParser.Res
} }
/** /**
* Parses a HTTP response in the receivers buffer. * Parses an HTTP response in the receivers buffer.
* *
* @return true to indicate that parsing should be interrupted (and will be resumed by another thread). * @return true to indicate that parsing should be interrupted (and will be resumed by another thread).
*/ */
@ -173,10 +173,10 @@ public class HttpReceiverOverHTTP extends HttpReceiver implements HttpParser.Res
boolean complete = this.complete; boolean complete = this.complete;
this.complete = false; this.complete = false;
if (LOG.isDebugEnabled()) if (LOG.isDebugEnabled())
LOG.debug("Parsed {}, remaining {} {}", handle, buffer.remaining(), parser); LOG.debug("Parsed {}, remaining {} {}", handle, BufferUtil.length(buffer), parser);
if (handle) if (handle)
return true; return true;
if (!buffer.hasRemaining()) if (!BufferUtil.hasContent(buffer))
return false; return false;
if (complete) if (complete)
{ {

View File

@ -100,7 +100,7 @@ public class HostnameVerificationTest
/** /**
* This test is supposed to verify that hostname verification works as described in: * This test is supposed to verify that hostname verification works as described in:
* http://www.ietf.org/rfc/rfc2818.txt section 3.1. It uses a certificate with a common name different to localhost * http://www.ietf.org/rfc/rfc2818.txt section 3.1. It uses a certificate with a common name different to localhost
* and sends a request to localhost. This should fail with a SSLHandshakeException. * and sends a request to localhost. This should fail with an SSLHandshakeException.
* *
* @throws Exception on test failure * @throws Exception on test failure
*/ */

View File

@ -494,7 +494,7 @@ public class HttpConnectionLifecycleTest extends AbstractHttpClientServerTest
.scheme(scenario.getScheme()) .scheme(scenario.getScheme())
.onResponseBegin(response1 -> .onResponseBegin(response1 ->
{ {
// Simulate a HTTP 1.0 response has been received. // Simulate an HTTP 1.0 response has been received.
((HttpResponse)response1).version(HttpVersion.HTTP_1_0); ((HttpResponse)response1).version(HttpVersion.HTTP_1_0);
}) })
.send(); .send();

View File

@ -1803,7 +1803,7 @@ public class SslBytesServerTest extends SslBytesTest
assertTrue(latch.await(idleTimeout * 2, TimeUnit.MILLISECONDS)); assertTrue(latch.await(idleTimeout * 2, TimeUnit.MILLISECONDS));
// Be sure that the server sent a SSL close alert // Be sure that the server sent an SSL close alert
TLSRecord record = proxy.readFromServer(); TLSRecord record = proxy.readFromServer();
assertNotNull(record); assertNotNull(record);
assertEquals(TLSRecord.Type.ALERT, record.getType()); assertEquals(TLSRecord.Type.ALERT, record.getType());

View File

@ -26,7 +26,7 @@ import javax.servlet.ServletResponseWrapper;
/** /**
* Continuation. * Continuation.
* <p> * <p>
* A continuation is a mechanism by which a HTTP Request can be suspended and * A continuation is a mechanism by which an HTTP Request can be suspended and
* restarted after a timeout or an asynchronous event has occurred. * restarted after a timeout or an asynchronous event has occurred.
* <p> * <p>
* The continuation mechanism is a portable mechanism that will work * The continuation mechanism is a portable mechanism that will work

View File

@ -1,10 +1,10 @@
<?xml version="1.0"?><!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd"> <?xml version="1.0"?><!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<!-- ============================================================= --><!-- Configure the Jetty Server instance with an ID "Server" --><!-- by adding a HTTP connector. --><!-- This configuration must be used in conjunction with jetty.xml --><!-- ============================================================= --> <!-- ============================================================= --><!-- Configure the Jetty Server instance with an ID "Server" --><!-- by adding an HTTP connector. --><!-- This configuration must be used in conjunction with jetty.xml --><!-- ============================================================= -->
<Configure id="Server" class="org.eclipse.jetty.server.Server"> <Configure id="Server" class="org.eclipse.jetty.server.Server">
<!-- =========================================================== --> <!-- =========================================================== -->
<!-- Add a HTTP Connector. --> <!-- Add an HTTP Connector. -->
<!-- Configure an o.e.j.server.ServerConnector with a single --> <!-- Configure an o.e.j.server.ServerConnector with a single -->
<!-- HttpConnectionFactory instance using the common httpConfig --> <!-- HttpConnectionFactory instance using the common httpConfig -->
<!-- instance defined in jetty.xml --> <!-- instance defined in jetty.xml -->

View File

@ -34,6 +34,7 @@ Once the `session-cache-hash` module has been enabled, you can view a list of al
#jetty.session.saveOnInactiveEvict=false #jetty.session.saveOnInactiveEvict=false
#jetty.session.saveOnCreate=false #jetty.session.saveOnCreate=false
#jetty.session.removeUnloadableSessions=false #jetty.session.removeUnloadableSessions=false
#jetty.session.flushOnResponseCommit=false
---- ----
jetty.session.evictionPolicy:: jetty.session.evictionPolicy::
@ -63,6 +64,12 @@ jetty.session.removeUnloadableSessions::
Boolean, default `false`. Boolean, default `false`.
Controls whether a session that cannot be restored - for example because it is corrupted - from the `SessionDataStore` is deleted by the `SessionDataStore`. Controls whether a session that cannot be restored - for example because it is corrupted - from the `SessionDataStore` is deleted by the `SessionDataStore`.
jetty.session.flushOnResponseCommit::
Boolean, default `false`.
If true, if a session is "dirty" - ie its attributes have changed - it will be written to the backing store as the response is about to commit.
This ensures that all subsequent requests whether to the same or different node will see the updated session data.
If false, a dirty session will only be written to the backing store when the last simultaneous request for it leaves the session.
For more general information on the uses of these configuration properties, see link:#sessions-details[Session Components]. For more general information on the uses of these configuration properties, see link:#sessions-details[Session Components].
@ -73,3 +80,20 @@ You may need to use it if your clustering setup does not have a sticky load bala
If you use this in conjunction with the `NullSessionDataStore`, then sessions will neither be retained in memory nor persisted. If you use this in conjunction with the `NullSessionDataStore`, then sessions will neither be retained in memory nor persisted.
To enable the `NullSessionCache`, enable the `sesssion-cache-null` link:#startup-modules[module]. To enable the `NullSessionCache`, enable the `sesssion-cache-null` link:#startup-modules[module].
Configuration options are:
jetty.session.saveOnCreate::
Boolean, default `false`.
Controls whether a session that is newly created will be immediately saved to the `SessionDataStore` or lazily saved as the last request for the session exits.
jetty.session.removeUnloadableSessions::
Boolean, default `false`.
Controls whether a session that cannot be restored - for example because it is corrupted - from the `SessionDataStore` is deleted by the `SessionDataStore`.
jetty.session.flushOnResponseCommit::
Boolean, default `false`.
If true, if a session is "dirty" - ie its attributes have changed - it will be written to the backing store as the response is about to commit.
This ensures that all subsequent requests whether to the same or different node will see the updated session data.
If false, a dirty session will only be written to the backing store when the last simultaneous request for it leaves the session.
For more general information on the uses of these configuration properties, see link:#sessions-details[Session Components].

View File

@ -743,7 +743,7 @@ If you are using Conscrypt with Java 8, you must exclude `TLSv1.3` protocol as i
==== Configuring SNI ==== Configuring SNI
From Java 8, the JVM contains support for the http://en.wikipedia.org/wiki/Server_Name_Indication[Server Name Indicator (SNI)] extension, which allows a SSL connection handshake to indicate one or more DNS names that it applies to. From Java 8, the JVM contains support for the http://en.wikipedia.org/wiki/Server_Name_Indication[Server Name Indicator (SNI)] extension, which allows an SSL connection handshake to indicate one or more DNS names that it applies to.
To support this, the `SslContextFactory` is used. To support this, the `SslContextFactory` is used.
The `SslContextFactory` will look for multiple X509 certificates within the keystore, each of which may have multiple DNS names (including wildcards) associated with the http://en.wikipedia.org/wiki/SubjectAltName[Subject Alternate Name] extension. The `SslContextFactory` will look for multiple X509 certificates within the keystore, each of which may have multiple DNS names (including wildcards) associated with the http://en.wikipedia.org/wiki/SubjectAltName[Subject Alternate Name] extension.

View File

@ -32,11 +32,14 @@ _____
.Jetty Versions .Jetty Versions
[width="100%",cols="12%,9%,15%,6%,21%,10%,6%,21%",options="header",] [width="100%",cols="12%,9%,15%,6%,21%,10%,6%,21%",options="header",]
|======================================================================= |=======================================================================
|Version |Year |Home |JVM |Protocols |Servlet |JSP |Status |Version |Year |Home |Min JVM |Protocols |Servlet |JSP |Status
|10 |2019- |Eclipse |11 ^(1)^ |HTTP/1.1 (RFC 7230), HTTP/2 (RFC 7540), WebSocket (RFC 6455, JSR 356), FastCGI |4.0.2 |2.3 |*UNSTABLE / Alpha*
|9.4 |2016- |Eclipse |1.8 |HTTP/1.1 (RFC 7230), HTTP/2 (RFC 7540), WebSocket (RFC 6455, JSR 356), FastCGI |3.1 |2.3 |Stable |9.4 |2016- |Eclipse |1.8 |HTTP/1.1 (RFC 7230), HTTP/2 (RFC 7540), WebSocket (RFC 6455, JSR 356), FastCGI |3.1 |2.3 |Stable
|9.3 |2015- |Eclipse |1.8 |HTTP/1.1 (RFC 7230), HTTP/2 (RFC 7540), WebSocket (RFC 6455, JSR 356), FastCGI |3.1 |2.3 |Stable |9.3 |2015- |Eclipse |1.8 ^(2)^ |HTTP/1.1 (RFC 7230), HTTP/2 (RFC 7540), WebSocket (RFC 6455, JSR 356), FastCGI |3.1 |2.3 |Stable
|9.2 |2014-2018 |Eclipse |1.7 |HTTP/1.1 RFC2616, javax.websocket, SPDY v3 |3.1 |2.3 |Deprecated / *End of Life January 2018* |9.2 |2014-2018 |Eclipse |1.7 ^(2)^ |HTTP/1.1 RFC2616, javax.websocket, SPDY v3 |3.1 |2.3 |Deprecated / *End of Life January 2018*
|8 |2009-2014 |Eclipse/Codehaus |1.6 |HTTP/1.1 RFC2616, WebSocket RFC 6455, SPDY v3 |3.0 |2.2 |Deprecated / *End of Life November 2014* |9.1 |2013-2014 |Eclipse |1.7 ^(2)^ |HTTP/1.1 RFC2616 |3.1 |2.3 |Deprecated / *End of Life May 2014*
|9.0 |2013-2013 |Eclipse |1.7 ^(2)^ |HTTP/1.1 RFC2616 |3.1-beta |2.3 |Deprecated / *End of Life November 2013*
|8 |2009-2014 |Eclipse/Codehaus |1.6 ^(2)^ |HTTP/1.1 RFC2616, WebSocket RFC 6455, SPDY v3 |3.0 |2.2 |Deprecated / *End of Life November 2014*
|7 |2008-2014 |Eclipse/Codehaus |1.5 |HTTP/1.1 RFC2616, WebSocket RFC 6455, SPDY v3 |2.5 |2.1 |Deprecated / *End of Life November 2014* |7 |2008-2014 |Eclipse/Codehaus |1.5 |HTTP/1.1 RFC2616, WebSocket RFC 6455, SPDY v3 |2.5 |2.1 |Deprecated / *End of Life November 2014*
|6 |2006-2010 |Codehaus |1.4-1.5 |HTTP/1.1 RFC2616 |2.5 |2.0 |Deprecated / *End of Life November 2010* |6 |2006-2010 |Codehaus |1.4-1.5 |HTTP/1.1 RFC2616 |2.5 |2.0 |Deprecated / *End of Life November 2010*
|5 |2003-2009 |Sourceforge |1.2-1.5 |HTTP/1.1 RFC2616 |2.4 |2.0 |Antique |5 |2003-2009 |Sourceforge |1.2-1.5 |HTTP/1.1 RFC2616 |2.4 |2.0 |Antique
@ -45,3 +48,6 @@ _____
|2 |1998-2000 |Mortbay |1.1 |HTTP/1.0 RFC1945 |2.1 |1.0 |Legendary |2 |1998-2000 |Mortbay |1.1 |HTTP/1.0 RFC1945 |2.1 |1.0 |Legendary
|1 |1995-1998 |Mortbay |1.0 |HTTP/1.0 RFC1945 |- |- |Mythical |1 |1995-1998 |Mortbay |1.0 |HTTP/1.0 RFC1945 |- |- |Mythical
|======================================================================= |=======================================================================
1. JPMS module support is optional
2. JDK9 and newer is not supported if using MultiRelease JAR Files, or Bytecode / Annotation scanning.

View File

@ -44,7 +44,7 @@ import org.eclipse.jetty.util.ProcessorUtils;
/** /**
* Specific implementation of {@link org.eclipse.jetty.proxy.AsyncProxyServlet.Transparent} for FastCGI. * Specific implementation of {@link org.eclipse.jetty.proxy.AsyncProxyServlet.Transparent} for FastCGI.
* <p> * <p>
* This servlet accepts a HTTP request and transforms it into a FastCGI request * This servlet accepts an HTTP request and transforms it into a FastCGI request
* that is sent to the FastCGI server specified in the {@code proxyTo} * that is sent to the FastCGI server specified in the {@code proxyTo}
* init-param. * init-param.
* <p> * <p>

View File

@ -711,6 +711,11 @@
<artifactId>jetty-alpn-openjdk8-server</artifactId> <artifactId>jetty-alpn-openjdk8-server</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-openid</artifactId>
<version>${project.version}</version>
</dependency>
<dependency> <dependency>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-alpn-conscrypt-server</artifactId> <artifactId>jetty-alpn-conscrypt-server</artifactId>

View File

@ -21,7 +21,7 @@ package org.eclipse.jetty.http;
import org.eclipse.jetty.util.HostPort; import org.eclipse.jetty.util.HostPort;
/** /**
* A HttpField holding a preparsed Host and port number * An HttpField holding a preparsed Host and port number
* *
* @see HostPort * @see HostPort
*/ */

View File

@ -23,7 +23,7 @@ import java.util.Objects;
import org.eclipse.jetty.util.StringUtil; import org.eclipse.jetty.util.StringUtil;
/** /**
* A HTTP Field * An HTTP Field
*/ */
public class HttpField public class HttpField
{ {
@ -37,7 +37,10 @@ public class HttpField
public HttpField(HttpHeader header, String name, String value) public HttpField(HttpHeader header, String name, String value)
{ {
_header = header; _header = header;
_name = name; if (_header != null && name == null)
_name = _header.asString();
else
_name = Objects.requireNonNull(name);
_value = value; _value = value;
} }
@ -325,8 +328,6 @@ public class HttpField
return false; return false;
if (!_name.equalsIgnoreCase(field.getName())) if (!_name.equalsIgnoreCase(field.getName()))
return false; return false;
if (_value == null && field.getValue() != null)
return false;
return Objects.equals(_value, field.getValue()); return Objects.equals(_value, field.getValue());
} }

Some files were not shown because too many files have changed in this diff Show More