Fixes #3080 - Do not create and use jars with "tests" classifier.

Removed the jetty-server and jetty-servlet test-jar artifacts.
The only one left is the jetty-maven-plugin test-jar.

Signed-off-by: Simone Bordet <simone.bordet@gmail.com>
This commit is contained in:
Simone Bordet 2020-11-25 19:16:50 +01:00
parent ed9fd7cb51
commit 5d83f6670a
16 changed files with 343 additions and 602 deletions

View File

@ -86,13 +86,6 @@
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>${project.version}</version>
<classifier>tests</classifier>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId> <artifactId>jetty-servlet</artifactId>

View File

@ -22,7 +22,6 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader; import java.net.URLClassLoader;
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;
@ -32,11 +31,14 @@ import org.apache.jasper.runtime.JspFactoryImpl;
import org.apache.tomcat.InstanceManager; import org.apache.tomcat.InstanceManager;
import org.apache.tomcat.SimpleInstanceManager; import org.apache.tomcat.SimpleInstanceManager;
import org.eclipse.jetty.http.HttpTester; import org.eclipse.jetty.http.HttpTester;
import org.eclipse.jetty.server.LocalConnector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.servlet.ServletTester;
import org.eclipse.jetty.toolchain.test.MavenTestingUtils; import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDir; import org.eclipse.jetty.toolchain.test.jupiter.WorkDir;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension; import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension;
import org.eclipse.jetty.util.component.LifeCycle;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -50,20 +52,13 @@ import static org.hamcrest.Matchers.not;
public class TestJettyJspServlet public class TestJettyJspServlet
{ {
public WorkDir workdir; public WorkDir workdir;
private Server _server;
private File _dir; private LocalConnector _connector;
private ServletTester _tester;
public static class DfltServlet extends HttpServlet public static class DfltServlet extends HttpServlet
{ {
public DfltServlet()
{
super();
}
@Override @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException
{ {
resp.setContentType("html/text"); resp.setContentType("html/text");
resp.getOutputStream().println("This.Is.The.Default."); resp.getOutputStream().println("This.Is.The.Default.");
@ -74,26 +69,27 @@ public class TestJettyJspServlet
public void setUp() throws Exception public void setUp() throws Exception
{ {
JspFactory.setDefaultFactory(new JspFactoryImpl()); JspFactory.setDefaultFactory(new JspFactoryImpl());
_dir = MavenTestingUtils.getTestResourceDir("base"); File baseDir = MavenTestingUtils.getTestResourceDir("base");
_tester = new ServletTester("/context"); _server = new Server();
_tester.getContext().setClassLoader(new URLClassLoader(new URL[0], Thread.currentThread().getContextClassLoader())); _connector = new LocalConnector(_server);
ServletHolder jspHolder = _tester.getContext().addServlet(JettyJspServlet.class, "/*"); _server.addConnector(_connector);
ServletContextHandler context = new ServletContextHandler(_server, "/context", true, false);
context.setClassLoader(new URLClassLoader(new URL[0], Thread.currentThread().getContextClassLoader()));
ServletHolder jspHolder = context.addServlet(JettyJspServlet.class, "/*");
jspHolder.setInitParameter("scratchdir", workdir.getPath().toString()); jspHolder.setInitParameter("scratchdir", workdir.getPath().toString());
_tester.getContext().setResourceBase(_dir.getAbsolutePath()); context.setResourceBase(baseDir.getAbsolutePath());
_tester.getContext().setAttribute(InstanceManager.class.getName(), new SimpleInstanceManager()); context.setAttribute(InstanceManager.class.getName(), new SimpleInstanceManager());
ServletHolder dfltHolder = new ServletHolder(); ServletHolder dfltHolder = new ServletHolder();
dfltHolder.setName("default"); dfltHolder.setName("default");
dfltHolder.setHeldClass(DfltServlet.class); dfltHolder.setHeldClass(DfltServlet.class);
_tester.getContext().addServlet(dfltHolder, "/"); context.addServlet(dfltHolder, "/");
_server.start();
_tester.start();
} }
@AfterEach @AfterEach
public void tearDown() throws Exception public void tearDown()
{ {
if (_tester != null) LifeCycle.stop(_server);
_tester.stop();
} }
@Test @Test
@ -106,7 +102,7 @@ public class TestJettyJspServlet
"Connection: close\r\n" + "Connection: close\r\n" +
"\r\n"; "\r\n";
String rawResponse = _tester.getResponses(request); String rawResponse = _connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse); HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getContent(), not(containsString("This.Is.The.Default."))); assertThat(response.toString(), response.getContent(), not(containsString("This.Is.The.Default.")));
} }
@ -120,7 +116,7 @@ public class TestJettyJspServlet
"Host: localhost\r\n" + "Host: localhost\r\n" +
"Connection: close\r\n" + "Connection: close\r\n" +
"\r\n"; "\r\n";
String rawResponse = _tester.getResponses(request); String rawResponse = _connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse); HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getContent(), containsString("This.Is.The.Default.")); assertThat(response.toString(), response.getContent(), containsString("This.Is.The.Default."));
} }

View File

@ -158,13 +158,6 @@
<version>${project.version}</version> <version>${project.version}</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>${project.version}</version>
<classifier>tests</classifier>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>org.eclipse.jetty.toolchain</groupId> <groupId>org.eclipse.jetty.toolchain</groupId>
<artifactId>jetty-test-helper</artifactId> <artifactId>jetty-test-helper</artifactId>

View File

@ -19,8 +19,10 @@
package org.eclipse.jetty; package org.eclipse.jetty;
import com.acme.ChatServlet; import com.acme.ChatServlet;
import org.eclipse.jetty.server.LocalConnector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.servlet.ServletTester;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -30,23 +32,25 @@ import static org.hamcrest.Matchers.is;
public class ChatServletTest public class ChatServletTest
{ {
private Server server;
private final ServletTester tester = new ServletTester(); private LocalConnector connector;
@BeforeEach @BeforeEach
public void setUp() throws Exception public void setUp() throws Exception
{ {
tester.setContextPath("/"); server = new Server();
connector = new LocalConnector(server);
ServletHolder dispatch = tester.addServlet(ChatServlet.class, "/chat/*"); server.addConnector(connector);
ServletContextHandler context = new ServletContextHandler(server, "/");
ServletHolder dispatch = context.addServlet(ChatServlet.class, "/chat/*");
dispatch.setInitParameter("asyncTimeout", "500"); dispatch.setInitParameter("asyncTimeout", "500");
tester.start(); server.start();
} }
@AfterEach @AfterEach
public void tearDown() throws Exception public void tearDown() throws Exception
{ {
tester.stop(); server.stop();
} }
@Test @Test
@ -59,7 +63,7 @@ public class ChatServletTest
public void testChat() throws Exception public void testChat() throws Exception
{ {
assertResponse("user=test&join=true&message=has%20joined!", "{\"from\":\"test\",\"chat\":\"has joined!\"}"); assertResponse("user=test&join=true&message=has%20joined!", "{\"from\":\"test\",\"chat\":\"has joined!\"}");
String response = tester.getResponses(createRequestString("user=test&message=message")); String response = connector.getResponse(createRequestString("user=test&message=message"));
assertThat(response.contains("{"), is(false)); // make sure we didn't get a json body assertThat(response.contains("{"), is(false)); // make sure we didn't get a json body
} }
@ -71,20 +75,18 @@ public class ChatServletTest
private void assertResponse(String requestBody, String expectedResponse) throws Exception private void assertResponse(String requestBody, String expectedResponse) throws Exception
{ {
String response = tester.getResponses(createRequestString(requestBody)); String response = connector.getResponse(createRequestString(requestBody));
assertThat(response.contains(expectedResponse), is(true)); assertThat(response.contains(expectedResponse), is(true));
} }
private String createRequestString(String body) private String createRequestString(String body)
{ {
StringBuilder req1 = new StringBuilder(); return "POST /chat/ HTTP/1.1\r\n" +
req1.append("POST /chat/ HTTP/1.1\r\n"); "Host: tester\r\n" +
req1.append("Host: tester\r\n"); "Content-length: " + body.length() + "\r\n" +
req1.append("Content-length: " + body.length() + "\r\n"); "Content-type: application/x-www-form-urlencoded\r\n" +
req1.append("Content-type: application/x-www-form-urlencoded\r\n"); "Connection: close\r\n" +
req1.append("Connection: close\r\n"); "\r\n" +
req1.append("\r\n"); body;
req1.append(body);
return req1.toString();
} }
} }

View File

@ -19,10 +19,15 @@
package org.eclipse.jetty; package org.eclipse.jetty;
import com.acme.DispatchServlet; import com.acme.DispatchServlet;
import org.eclipse.jetty.server.LocalConnector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.DefaultServlet; import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.servlet.ServletTester; import org.eclipse.jetty.util.component.LifeCycle;
import org.hamcrest.Matchers; import org.hamcrest.Matchers;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.MatcherAssert.assertThat;
@ -34,6 +39,26 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
*/ */
public class DispatchServletTest public class DispatchServletTest
{ {
private Server server;
private LocalConnector connector;
private ServletContextHandler context;
@BeforeEach
public void setUp() throws Exception
{
server = new Server();
connector = new LocalConnector(server);
server.addConnector(connector);
context = new ServletContextHandler(server, "/tests");
server.start();
}
@AfterEach
public void tearDown()
{
LifeCycle.stop(server);
}
/** /**
* As filed in JETTY-978. * As filed in JETTY-978.
* *
@ -71,20 +96,14 @@ public class DispatchServletTest
@Test @Test
public void testSelfRefForwardDenialOfService() throws Exception public void testSelfRefForwardDenialOfService() throws Exception
{ {
ServletTester tester = new ServletTester(); ServletHolder dispatch = context.addServlet(DispatchServlet.class, "/dispatch/*");
tester.setContextPath("/tests"); context.addServlet(DefaultServlet.class, "/");
ServletHolder dispatch = tester.addServlet(DispatchServlet.class, "/dispatch/*"); String request = "GET /tests/dispatch/includeN/" + dispatch.getName() + " HTTP/1.1\n" +
tester.addServlet(DefaultServlet.class, "/"); "Host: tester\n" +
tester.start(); "Connection: close\n" +
"\n";
StringBuilder req1 = new StringBuilder(); String response = connector.getResponse(request);
req1.append("GET /tests/dispatch/includeN/").append(dispatch.getName()).append(" HTTP/1.1\n");
req1.append("Host: tester\n");
req1.append("Connection: close\n");
req1.append("\n");
String response = tester.getResponses(req1.toString());
String msg = "Response code on SelfRefDoS"; String msg = "Response code on SelfRefDoS";
@ -95,11 +114,8 @@ public class DispatchServletTest
@Test @Test
public void testSelfRefDeep() throws Exception public void testSelfRefDeep() throws Exception
{ {
ServletTester tester = new ServletTester(); context.addServlet(DispatchServlet.class, "/dispatch/*");
tester.setContextPath("/tests"); context.addServlet(DefaultServlet.class, "/");
tester.addServlet(DispatchServlet.class, "/dispatch/*");
tester.addServlet(DefaultServlet.class, "/");
tester.start();
String[] selfRefs = String[] selfRefs =
{"/dispatch/forward", "/dispatch/includeS", "/dispatch/includeW", "/dispatch/includeN",}; {"/dispatch/forward", "/dispatch/includeS", "/dispatch/includeW", "/dispatch/includeN",};
@ -113,19 +129,13 @@ public class DispatchServletTest
for (String selfRef : selfRefs) for (String selfRef : selfRefs)
{ {
StringBuilder req1 = new StringBuilder(); String request = "GET /tests" +
req1.append("GET /tests"); selfRef.repeat(nestedDepth) +
for (int i = 0; i < nestedDepth; i++) "/ HTTP/1.1\n" +
{ "Host: tester\n" +
req1.append(selfRef); "Connection: close\n" +
} "\n";
String response = connector.getResponse(request);
req1.append("/ HTTP/1.1\n");
req1.append("Host: tester\n");
req1.append("Connection: close\n");
req1.append("\n");
String response = tester.getResponses(req1.toString());
StringBuilder msg = new StringBuilder(); StringBuilder msg = new StringBuilder();
msg.append("Response code on nested \"").append(selfRef).append("\""); msg.append("Response code on nested \"").append(selfRef).append("\"");

View File

@ -16,19 +16,6 @@
<build> <build>
<plugins> <plugins>
<!--TODO: do we need this test-jar?-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<id>test-jar</id>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin> <plugin>
<groupId>org.codehaus.mojo</groupId> <groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId> <artifactId>findbugs-maven-plugin</artifactId>

View File

@ -26,18 +26,6 @@
</argLine> </argLine>
</configuration> </configuration>
</plugin> </plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<id>tests</id>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin> <plugin>
<groupId>org.codehaus.mojo</groupId> <groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId> <artifactId>findbugs-maven-plugin</artifactId>

View File

@ -1,263 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2020 Mort Bay Consulting Pty Ltd and others.
//
// This program and the accompanying materials are made available under
// the terms of the Eclipse Public License 2.0 which is available at
// https://www.eclipse.org/legal/epl-2.0
//
// This Source Code may also be made available under the following
// Secondary Licenses when the conditions for such availability set
// forth in the Eclipse Public License, v. 2.0 are satisfied:
// the Apache License v2.0 which is available at
// https://www.apache.org/licenses/LICENSE-2.0
//
// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
// ========================================================================
//
package org.eclipse.jetty.servlet;
import java.net.InetAddress;
import java.nio.ByteBuffer;
import java.util.EnumSet;
import java.util.Enumeration;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.Servlet;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.LocalConnector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.util.Attributes;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.resource.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ServletTester extends ContainerLifeCycle
{
private static final Logger LOG = LoggerFactory.getLogger(ServletTester.class);
private final Server _server = new Server();
private final LocalConnector _connector = new LocalConnector(_server);
private final ServletContextHandler _context;
public Server getServer()
{
return _server;
}
public LocalConnector getConnector()
{
return _connector;
}
public void setVirtualHosts(String[] vhosts)
{
_context.setVirtualHosts(vhosts);
}
public void addVirtualHosts(String[] virtualHosts)
{
_context.addVirtualHosts(virtualHosts);
}
public ServletHolder addServlet(String className, String pathSpec)
{
return _context.addServlet(className, pathSpec);
}
public ServletHolder addServlet(Class<? extends Servlet> servlet, String pathSpec)
{
return _context.addServlet(servlet, pathSpec);
}
public void addServlet(ServletHolder servlet, String pathSpec)
{
_context.addServlet(servlet, pathSpec);
}
public void addFilter(FilterHolder holder, String pathSpec, EnumSet<DispatcherType> dispatches)
{
_context.addFilter(holder, pathSpec, dispatches);
}
public FilterHolder addFilter(Class<? extends Filter> filterClass, String pathSpec, EnumSet<DispatcherType> dispatches)
{
return _context.addFilter(filterClass, pathSpec, dispatches);
}
public FilterHolder addFilter(String filterClass, String pathSpec, EnumSet<DispatcherType> dispatches)
{
return _context.addFilter(filterClass, pathSpec, dispatches);
}
public Object getAttribute(String name)
{
return _context.getAttribute(name);
}
public Enumeration<String> getAttributeNames()
{
return _context.getAttributeNames();
}
public Attributes getAttributes()
{
return _context.getAttributes();
}
public String getContextPath()
{
return _context.getContextPath();
}
public String getInitParameter(String name)
{
return _context.getInitParameter(name);
}
public String setInitParameter(String name, String value)
{
return _context.setInitParameter(name, value);
}
public Enumeration<String> getInitParameterNames()
{
return _context.getInitParameterNames();
}
public Map<String, String> getInitParams()
{
return _context.getInitParams();
}
public void removeAttribute(String name)
{
_context.removeAttribute(name);
}
public void setAttribute(String name, Object value)
{
_context.setAttribute(name, value);
}
public void setContextPath(String contextPath)
{
_context.setContextPath(contextPath);
}
public Resource getBaseResource()
{
return _context.getBaseResource();
}
public void setBaseResource(Resource resource)
{
_context.setBaseResource(resource);
}
public String getResourceBase()
{
return _context.getResourceBase();
}
public void setResourceBase(String resourceBase)
{
_context.setResourceBase(resourceBase);
}
public ServletTester()
{
this("/", ServletContextHandler.SECURITY | ServletContextHandler.SESSIONS);
}
public ServletTester(String ctxPath)
{
this(ctxPath, ServletContextHandler.SECURITY | ServletContextHandler.SESSIONS);
}
public ServletTester(String contextPath, int options)
{
_context = new ServletContextHandler(_server, contextPath, options);
_server.setConnectors(new Connector[]{_connector});
addBean(_server);
}
public ServletContextHandler getContext()
{
return _context;
}
public String getResponses(String request) throws Exception
{
if (LOG.isDebugEnabled())
{
LOG.debug("Request: {}", request);
}
return _connector.getResponse(request);
}
public String getResponses(String request, long idleFor, TimeUnit units) throws Exception
{
if (LOG.isDebugEnabled())
{
LOG.debug("Request: {}", request);
}
return _connector.getResponse(request, idleFor, units);
}
public ByteBuffer getResponses(ByteBuffer request) throws Exception
{
if (LOG.isDebugEnabled())
{
LOG.debug("Request (Buffer): {}", BufferUtil.toUTF8String(request));
}
return _connector.getResponse(request);
}
public ByteBuffer getResponses(ByteBuffer requestsBuffer, long idleFor, TimeUnit units) throws Exception
{
if (LOG.isDebugEnabled())
{
LOG.debug("Requests (Buffer): {}", BufferUtil.toUTF8String(requestsBuffer));
}
return _connector.getResponse(requestsBuffer, idleFor, units);
}
/**
* Create a port based connector.
* This methods adds a port connector to the server
*
* @param localhost true if connector should use localhost, false for default host behavior.
* @return A URL to access the server via the connector.
* @throws Exception on test failure
*/
public String createConnector(boolean localhost) throws Exception
{
ServerConnector connector = new ServerConnector(_server);
if (localhost)
connector.setHost("127.0.0.1");
_server.addConnector(connector);
if (_server.isStarted())
connector.start();
else
connector.open();
return "http://" + (localhost ? "127.0.0.1"
: InetAddress.getLocalHost().getHostAddress()) +
":" + connector.getLocalPort();
}
public LocalConnector createLocalConnector()
{
LocalConnector connector = new LocalConnector(_server);
_server.addConnector(connector);
return connector;
}
}

View File

@ -84,13 +84,6 @@
<version>${project.version}</version> <version>${project.version}</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>${project.version}</version>
<classifier>tests</classifier>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>org.eclipse.jetty.toolchain</groupId> <groupId>org.eclipse.jetty.toolchain</groupId>
<artifactId>jetty-test-helper</artifactId> <artifactId>jetty-test-helper</artifactId>

View File

@ -33,14 +33,16 @@ 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;
import org.eclipse.jetty.http.HttpURI; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.session.DefaultSessionCache; import org.eclipse.jetty.server.session.DefaultSessionCache;
import org.eclipse.jetty.server.session.FileSessionDataStore; import org.eclipse.jetty.server.session.FileSessionDataStore;
import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletTester; import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.toolchain.test.FS; import org.eclipse.jetty.toolchain.test.FS;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDir; import org.eclipse.jetty.toolchain.test.jupiter.WorkDir;
import org.eclipse.jetty.util.IO; import org.eclipse.jetty.util.IO;
import org.eclipse.jetty.util.component.LifeCycle;
import org.hamcrest.Matchers; import org.hamcrest.Matchers;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -53,16 +55,18 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
public abstract class AbstractDoSFilterTest public abstract class AbstractDoSFilterTest
{ {
protected ServletTester _tester; private Server _server;
protected String _host; private ServerConnector _connector;
protected int _port;
protected long _requestMaxTime = 200; protected long _requestMaxTime = 200;
public void startServer(WorkDir workDir, Class<? extends Filter> filter) throws Exception public void startServer(WorkDir workDir, Class<? extends Filter> filter) throws Exception
{ {
_tester = new ServletTester("/ctx"); _server = new Server();
_connector = new ServerConnector(_server);
_server.addConnector(_connector);
ServletContextHandler context = new ServletContextHandler(_server, "/ctx", true, false);
DefaultSessionCache sessionCache = new DefaultSessionCache(_tester.getContext().getSessionHandler()); DefaultSessionCache sessionCache = new DefaultSessionCache(context.getSessionHandler());
FileSessionDataStore fileStore = new FileSessionDataStore(); FileSessionDataStore fileStore = new FileSessionDataStore();
Path p = workDir.getPathFile("sessions"); Path p = workDir.getPathFile("sessions");
@ -70,15 +74,11 @@ public abstract class AbstractDoSFilterTest
fileStore.setStoreDir(p.toFile()); fileStore.setStoreDir(p.toFile());
sessionCache.setSessionDataStore(fileStore); sessionCache.setSessionDataStore(fileStore);
_tester.getContext().getSessionHandler().setSessionCache(sessionCache); context.getSessionHandler().setSessionCache(sessionCache);
HttpURI uri = HttpURI.from(_tester.createConnector(true)); context.addServlet(TestServlet.class, "/*");
_host = uri.getHost();
_port = uri.getPort();
_tester.getContext().addServlet(TestServlet.class, "/*"); FilterHolder dosFilter = context.addFilter(filter, "/dos/*", EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC));
FilterHolder dosFilter = _tester.getContext().addFilter(filter, "/dos/*", EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC));
dosFilter.setInitParameter("maxRequestsPerSec", "4"); dosFilter.setInitParameter("maxRequestsPerSec", "4");
dosFilter.setInitParameter("delayMs", "200"); dosFilter.setInitParameter("delayMs", "200");
dosFilter.setInitParameter("throttledRequests", "1"); dosFilter.setInitParameter("throttledRequests", "1");
@ -87,7 +87,7 @@ public abstract class AbstractDoSFilterTest
dosFilter.setInitParameter("remotePort", "false"); dosFilter.setInitParameter("remotePort", "false");
dosFilter.setInitParameter("insertHeaders", "true"); dosFilter.setInitParameter("insertHeaders", "true");
FilterHolder timeoutFilter = _tester.getContext().addFilter(filter, "/timeout/*", EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC)); FilterHolder timeoutFilter = context.addFilter(filter, "/timeout/*", EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC));
timeoutFilter.setInitParameter("maxRequestsPerSec", "4"); timeoutFilter.setInitParameter("maxRequestsPerSec", "4");
timeoutFilter.setInitParameter("delayMs", "200"); timeoutFilter.setInitParameter("delayMs", "200");
timeoutFilter.setInitParameter("throttledRequests", "1"); timeoutFilter.setInitParameter("throttledRequests", "1");
@ -97,18 +97,18 @@ public abstract class AbstractDoSFilterTest
timeoutFilter.setInitParameter("insertHeaders", "true"); timeoutFilter.setInitParameter("insertHeaders", "true");
timeoutFilter.setInitParameter("maxRequestMs", _requestMaxTime + ""); timeoutFilter.setInitParameter("maxRequestMs", _requestMaxTime + "");
_tester.start(); _server.start();
} }
@AfterEach @AfterEach
public void stopServer() throws Exception public void stopServer() throws Exception
{ {
_tester.stop(); LifeCycle.stop(_server);
} }
protected String doRequests(String loopRequests, int loops, long pauseBetweenLoops, long pauseBeforeLast, String lastRequest) throws Exception protected String doRequests(String loopRequests, int loops, long pauseBetweenLoops, long pauseBeforeLast, String lastRequest) throws Exception
{ {
try (Socket socket = new Socket(_host, _port)) try (Socket socket = new Socket("localhost", _connector.getLocalPort()))
{ {
socket.setSoTimeout(30000); socket.setSoTimeout(30000);
@ -188,24 +188,20 @@ public abstract class AbstractDoSFilterTest
@Test @Test
public void testThrottledIP() throws Exception public void testThrottledIP() throws Exception
{ {
Thread other = new Thread() Thread other = new Thread(() ->
{ {
@Override try
public void run()
{ {
try // Cause a delay, then sleep while holding pass
{ String request = "GET /ctx/dos/sleeper HTTP/1.1\r\nHost: localhost\r\n\r\n";
// Cause a delay, then sleep while holding pass String last = "GET /ctx/dos/sleeper?sleep=2000 HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n";
String request = "GET /ctx/dos/sleeper HTTP/1.1\r\nHost: localhost\r\n\r\n"; doRequests(request + request + request + request, 1, 0, 0, last);
String last = "GET /ctx/dos/sleeper?sleep=2000 HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n";
doRequests(request + request + request + request, 1, 0, 0, last);
}
catch (Exception e)
{
e.printStackTrace();
}
} }
}; catch (Exception e)
{
e.printStackTrace();
}
});
other.start(); other.start();
Thread.sleep(1500); Thread.sleep(1500);
@ -224,24 +220,20 @@ public abstract class AbstractDoSFilterTest
@Test @Test
public void testUnavailableIP() throws Exception public void testUnavailableIP() throws Exception
{ {
Thread other = new Thread() Thread other = new Thread(() ->
{ {
@Override try
public void run()
{ {
try // Cause a delay, then sleep while holding pass
{ String request = "GET /ctx/dos/test HTTP/1.1\r\nHost: localhost\r\n\r\n";
// Cause a delay, then sleep while holding pass String last = "GET /ctx/dos/test?sleep=5000 HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n";
String request = "GET /ctx/dos/test HTTP/1.1\r\nHost: localhost\r\n\r\n"; doRequests(request + request + request + request, 1, 0, 0, last);
String last = "GET /ctx/dos/test?sleep=5000 HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n";
doRequests(request + request + request + request, 1, 0, 0, last);
}
catch (Exception e)
{
e.printStackTrace();
}
} }
}; catch (Exception e)
{
e.printStackTrace();
}
});
other.start(); other.start();
Thread.sleep(500); Thread.sleep(500);
@ -350,7 +342,7 @@ public abstract class AbstractDoSFilterTest
int count = Integer.parseInt(request.getParameter("lines")); int count = Integer.parseInt(request.getParameter("lines"));
for (int i = 0; i < count; ++i) for (int i = 0; i < count; ++i)
{ {
response.getWriter().append("Line: " + i + "\n"); response.getWriter().append("Line: ").append(String.valueOf(i)).append("\n");
response.flushBuffer(); response.flushBuffer();
try try

View File

@ -31,10 +31,13 @@ import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.http.HttpStatus; import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.http.HttpTester; import org.eclipse.jetty.http.HttpTester;
import org.eclipse.jetty.server.LocalConnector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.servlet.ServletTester;
import org.eclipse.jetty.util.StringUtil; import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.component.LifeCycle;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -48,36 +51,40 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
public class CrossOriginFilterTest public class CrossOriginFilterTest
{ {
private ServletTester tester; private Server server;
private LocalConnector connector;
private ServletContextHandler context;
@BeforeEach @BeforeEach
public void init() throws Exception public void init() throws Exception
{ {
tester = new ServletTester(); server = new Server();
tester.start(); connector = new LocalConnector(server);
server.addConnector(connector);
context = new ServletContextHandler(server, "/");
server.start();
} }
@AfterEach @AfterEach
public void destroy() throws Exception public void destroy()
{ {
if (tester != null) LifeCycle.stop(server);
tester.stop();
} }
@Test @Test
public void testRequestWithNoOriginArrivesToApplication() throws Exception public void testRequestWithNoOriginArrivesToApplication() throws Exception
{ {
tester.getContext().addFilter(CrossOriginFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(CrossOriginFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
final CountDownLatch latch = new CountDownLatch(1); final CountDownLatch latch = new CountDownLatch(1);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*"); context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request = String request =
"GET / HTTP/1.1\r\n" + "GET / HTTP/1.1\r\n" +
"Host: localhost\r\n" + "Host: localhost\r\n" +
"Connection: close\r\n" + "Connection: close\r\n" +
"\r\n"; "\r\n";
String rawResponse = tester.getResponses(request); String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse); HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200)); assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -90,10 +97,10 @@ public class CrossOriginFilterTest
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter()); FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
String origin = "http://localhost"; String origin = "http://localhost";
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, origin); filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, origin);
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*"); context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String otherOrigin = StringUtil.replace(origin, "localhost", "127.0.0.1"); String otherOrigin = StringUtil.replace(origin, "localhost", "127.0.0.1");
String request = String request =
@ -102,7 +109,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" + "Connection: close\r\n" +
"Origin: " + otherOrigin + "\r\n" + "Origin: " + otherOrigin + "\r\n" +
"\r\n"; "\r\n";
String rawResponse = tester.getResponses(request); String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse); HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200)); assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -116,10 +123,10 @@ public class CrossOriginFilterTest
public void testSimpleRequestWithWildcardOrigin() throws Exception public void testSimpleRequestWithWildcardOrigin() throws Exception
{ {
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter()); FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*"); context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String origin = "http://foo.example.com"; String origin = "http://foo.example.com";
String request = String request =
@ -128,7 +135,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" + "Connection: close\r\n" +
"Origin: " + origin + "\r\n" + "Origin: " + origin + "\r\n" +
"\r\n"; "\r\n";
String rawResponse = tester.getResponses(request); String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse); HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200)); assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -145,10 +152,10 @@ public class CrossOriginFilterTest
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter()); FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
String origin = "http://subdomain.example.com"; String origin = "http://subdomain.example.com";
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "http://*.example.com"); filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "http://*.example.com");
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*"); context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request = String request =
"GET / HTTP/1.1\r\n" + "GET / HTTP/1.1\r\n" +
@ -156,7 +163,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" + "Connection: close\r\n" +
"Origin: " + origin + "\r\n" + "Origin: " + origin + "\r\n" +
"\r\n"; "\r\n";
String rawResponse = tester.getResponses(request); String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse); HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200)); assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -174,10 +181,10 @@ public class CrossOriginFilterTest
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter()); FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
String origin = "http://subdomain.subdomain.example.com"; String origin = "http://subdomain.subdomain.example.com";
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "http://*.example.com"); filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "http://*.example.com");
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*"); context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request = String request =
"GET / HTTP/1.1\r\n" + "GET / HTTP/1.1\r\n" +
@ -185,7 +192,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" + "Connection: close\r\n" +
"Origin: " + origin + "\r\n" + "Origin: " + origin + "\r\n" +
"\r\n"; "\r\n";
String rawResponse = tester.getResponses(request); String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse); HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200)); assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -202,10 +209,10 @@ public class CrossOriginFilterTest
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter()); FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
String origin = "http://localhost"; String origin = "http://localhost";
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, origin); filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, origin);
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*"); context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request = String request =
"GET / HTTP/1.1\r\n" + "GET / HTTP/1.1\r\n" +
@ -213,7 +220,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" + "Connection: close\r\n" +
"Origin: " + origin + "\r\n" + "Origin: " + origin + "\r\n" +
"\r\n"; "\r\n";
String rawResponse = tester.getResponses(request); String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse); HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200)); assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -233,10 +240,10 @@ public class CrossOriginFilterTest
String timingOrigin = "http://127.0.0.1"; String timingOrigin = "http://127.0.0.1";
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, origin); filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, origin);
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_TIMING_ORIGINS_PARAM, timingOrigin); filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_TIMING_ORIGINS_PARAM, timingOrigin);
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*"); context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request = String request =
"GET / HTTP/1.1\r\n" + "GET / HTTP/1.1\r\n" +
@ -244,7 +251,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" + "Connection: close\r\n" +
"Origin: " + origin + "\r\n" + "Origin: " + origin + "\r\n" +
"\r\n"; "\r\n";
String response = tester.getResponses(request); String response = connector.getResponse(request);
assertTrue(response.contains("HTTP/1.1 200")); assertTrue(response.contains("HTTP/1.1 200"));
assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER)); assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER));
assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER)); assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER));
@ -260,10 +267,10 @@ public class CrossOriginFilterTest
String origin = "http://localhost"; String origin = "http://localhost";
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, origin); filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, origin);
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_TIMING_ORIGINS_PARAM, origin); filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_TIMING_ORIGINS_PARAM, origin);
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*"); context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request = String request =
"GET / HTTP/1.1\r\n" + "GET / HTTP/1.1\r\n" +
@ -271,7 +278,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" + "Connection: close\r\n" +
"Origin: " + origin + "\r\n" + "Origin: " + origin + "\r\n" +
"\r\n"; "\r\n";
String response = tester.getResponses(request); String response = connector.getResponse(request);
assertTrue(response.contains("HTTP/1.1 200")); assertTrue(response.contains("HTTP/1.1 200"));
assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER)); assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER));
assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER)); assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER));
@ -287,10 +294,10 @@ public class CrossOriginFilterTest
String origin = "http://localhost"; String origin = "http://localhost";
String otherOrigin = StringUtil.replace(origin, "localhost", "127.0.0.1"); String otherOrigin = StringUtil.replace(origin, "localhost", "127.0.0.1");
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, origin + "," + otherOrigin); filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, origin + "," + otherOrigin);
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*"); context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request = String request =
"GET / HTTP/1.1\r\n" + "GET / HTTP/1.1\r\n" +
@ -299,7 +306,7 @@ public class CrossOriginFilterTest
// Use 2 spaces as separator to test that the implementation does not fail // Use 2 spaces as separator to test that the implementation does not fail
"Origin: " + otherOrigin + " " + " " + origin + "\r\n" + "Origin: " + otherOrigin + " " + " " + origin + "\r\n" +
"\r\n"; "\r\n";
String rawResponse = tester.getResponses(request); String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse); HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200)); assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -315,10 +322,10 @@ public class CrossOriginFilterTest
{ {
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter()); FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
filterHolder.setInitParameter(CrossOriginFilter.ALLOW_CREDENTIALS_PARAM, "false"); filterHolder.setInitParameter(CrossOriginFilter.ALLOW_CREDENTIALS_PARAM, "false");
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*"); context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request = String request =
"GET / HTTP/1.1\r\n" + "GET / HTTP/1.1\r\n" +
@ -326,7 +333,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" + "Connection: close\r\n" +
"Origin: http://localhost\r\n" + "Origin: http://localhost\r\n" +
"\r\n"; "\r\n";
String rawResponse = tester.getResponses(request); String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse); HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200)); assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -344,10 +351,10 @@ public class CrossOriginFilterTest
// will contain the CORS response headers. // will contain the CORS response headers.
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter()); FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*"); context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request = String request =
"PUT / HTTP/1.1\r\n" + "PUT / HTTP/1.1\r\n" +
@ -355,7 +362,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" + "Connection: close\r\n" +
"Origin: http://localhost\r\n" + "Origin: http://localhost\r\n" +
"\r\n"; "\r\n";
String rawResponse = tester.getResponses(request); String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse); HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200)); assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -373,10 +380,10 @@ public class CrossOriginFilterTest
// will contain the CORS response headers. // will contain the CORS response headers.
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter()); FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*"); context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request = String request =
"OPTIONS / HTTP/1.1\r\n" + "OPTIONS / HTTP/1.1\r\n" +
@ -384,7 +391,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" + "Connection: close\r\n" +
"Origin: http://localhost\r\n" + "Origin: http://localhost\r\n" +
"\r\n"; "\r\n";
String rawResponse = tester.getResponses(request); String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse); HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200)); assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -399,10 +406,10 @@ public class CrossOriginFilterTest
{ {
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter()); FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM, "*"); filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM, "*");
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*"); context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request = String request =
"OPTIONS / HTTP/1.1\r\n" + "OPTIONS / HTTP/1.1\r\n" +
@ -412,7 +419,7 @@ public class CrossOriginFilterTest
CrossOriginFilter.ACCESS_CONTROL_REQUEST_METHOD_HEADER + ": GET\r\n" + CrossOriginFilter.ACCESS_CONTROL_REQUEST_METHOD_HEADER + ": GET\r\n" +
"Origin: http://localhost\r\n" + "Origin: http://localhost\r\n" +
"\r\n"; "\r\n";
String rawResponse = tester.getResponses(request); String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse); HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200)); assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -428,10 +435,10 @@ public class CrossOriginFilterTest
{ {
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter()); FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "PUT"); filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "PUT");
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*"); context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
// Preflight request // Preflight request
String request = String request =
@ -441,7 +448,7 @@ public class CrossOriginFilterTest
CrossOriginFilter.ACCESS_CONTROL_REQUEST_METHOD_HEADER + ": PUT\r\n" + CrossOriginFilter.ACCESS_CONTROL_REQUEST_METHOD_HEADER + ": PUT\r\n" +
"Origin: http://localhost\r\n" + "Origin: http://localhost\r\n" +
"\r\n"; "\r\n";
String rawResponse = tester.getResponses(request); String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse); HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200)); assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -460,7 +467,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" + "Connection: close\r\n" +
"Origin: http://localhost\r\n" + "Origin: http://localhost\r\n" +
"\r\n"; "\r\n";
rawResponse = tester.getResponses(request); rawResponse = connector.getResponse(request);
response = HttpTester.parseResponse(rawResponse); response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200)); assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -475,10 +482,10 @@ public class CrossOriginFilterTest
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter()); FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "GET,HEAD,POST,PUT,DELETE"); filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "GET,HEAD,POST,PUT,DELETE");
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM, "X-Requested-With,Content-Type,Accept,Origin,X-Custom"); filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM, "X-Requested-With,Content-Type,Accept,Origin,X-Custom");
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*"); context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
// Preflight request // Preflight request
String request = String request =
@ -489,7 +496,7 @@ public class CrossOriginFilterTest
CrossOriginFilter.ACCESS_CONTROL_REQUEST_HEADERS_HEADER + ": origin,x-custom,x-requested-with\r\n" + CrossOriginFilter.ACCESS_CONTROL_REQUEST_HEADERS_HEADER + ": origin,x-custom,x-requested-with\r\n" +
"Origin: http://localhost\r\n" + "Origin: http://localhost\r\n" +
"\r\n"; "\r\n";
String rawResponse = tester.getResponses(request); String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse); HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200)); assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -511,7 +518,7 @@ public class CrossOriginFilterTest
"X-Requested-With: local\r\n" + "X-Requested-With: local\r\n" +
"Origin: http://localhost\r\n" + "Origin: http://localhost\r\n" +
"\r\n"; "\r\n";
rawResponse = tester.getResponses(request); rawResponse = connector.getResponse(request);
response = HttpTester.parseResponse(rawResponse); response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200)); assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -525,10 +532,10 @@ public class CrossOriginFilterTest
{ {
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter()); FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "GET,HEAD,POST,PUT,DELETE"); filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "GET,HEAD,POST,PUT,DELETE");
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*"); context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
// Preflight request // Preflight request
String request = String request =
@ -539,7 +546,7 @@ public class CrossOriginFilterTest
CrossOriginFilter.ACCESS_CONTROL_REQUEST_HEADERS_HEADER + ": origin,x-custom,x-requested-with\r\n" + CrossOriginFilter.ACCESS_CONTROL_REQUEST_HEADERS_HEADER + ": origin,x-custom,x-requested-with\r\n" +
"Origin: http://localhost\r\n" + "Origin: http://localhost\r\n" +
"\r\n"; "\r\n";
String rawResponse = tester.getResponses(request); String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse); HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200)); assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -554,10 +561,10 @@ public class CrossOriginFilterTest
public void testCrossOriginFilterDisabledForWebSocketUpgrade() throws Exception public void testCrossOriginFilterDisabledForWebSocketUpgrade() throws Exception
{ {
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter()); FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*"); context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request = String request =
"GET / HTTP/1.1\r\n" + "GET / HTTP/1.1\r\n" +
@ -566,7 +573,7 @@ public class CrossOriginFilterTest
"Upgrade: WebSocket\r\n" + "Upgrade: WebSocket\r\n" +
"Origin: http://localhost\r\n" + "Origin: http://localhost\r\n" +
"\r\n"; "\r\n";
String rawResponse = tester.getResponses(request); String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse); HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200)); assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -581,10 +588,10 @@ public class CrossOriginFilterTest
{ {
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter()); FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
filterHolder.setInitParameter("exposedHeaders", "Content-Length"); filterHolder.setInitParameter("exposedHeaders", "Content-Length");
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*"); context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request = String request =
"GET / HTTP/1.1\r\n" + "GET / HTTP/1.1\r\n" +
@ -592,7 +599,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" + "Connection: close\r\n" +
"Origin: http://localhost\r\n" + "Origin: http://localhost\r\n" +
"\r\n"; "\r\n";
String rawResponse = tester.getResponses(request); String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse); HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200)); assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -607,10 +614,10 @@ public class CrossOriginFilterTest
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter()); FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "PUT"); filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "PUT");
filterHolder.setInitParameter(CrossOriginFilter.CHAIN_PREFLIGHT_PARAM, "false"); filterHolder.setInitParameter(CrossOriginFilter.CHAIN_PREFLIGHT_PARAM, "false");
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*"); context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
// Preflight request // Preflight request
String request = String request =
@ -620,7 +627,7 @@ public class CrossOriginFilterTest
CrossOriginFilter.ACCESS_CONTROL_REQUEST_METHOD_HEADER + ": PUT\r\n" + CrossOriginFilter.ACCESS_CONTROL_REQUEST_METHOD_HEADER + ": PUT\r\n" +
"Origin: http://localhost\r\n" + "Origin: http://localhost\r\n" +
"\r\n"; "\r\n";
String rawResponse = tester.getResponses(request); String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse); HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200)); assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));

View File

@ -29,8 +29,11 @@ import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.HttpStatus; import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.http.HttpTester; import org.eclipse.jetty.http.HttpTester;
import org.eclipse.jetty.server.LocalConnector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletTester; import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.util.component.LifeCycle;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -42,22 +45,25 @@ import static org.hamcrest.Matchers.is;
public class HeaderFilterTest public class HeaderFilterTest
{ {
private ServletTester _tester; private Server _server;
private LocalConnector _connector;
private ServletContextHandler _context;
@BeforeEach @BeforeEach
public void setUp() throws Exception public void setUp() throws Exception
{ {
_tester = new ServletTester(); _server = new Server();
_tester.setContextPath("/context"); _connector = new LocalConnector(_server);
_tester.addServlet(NullServlet.class, "/test/*"); _server.addConnector(_connector);
_context = new ServletContextHandler(_server, "/context");
_tester.start(); _context.addServlet(NullServlet.class, "/test/*");
_server.start();
} }
@AfterEach @AfterEach
public void tearDown() throws Exception public void tearDown()
{ {
_tester.stop(); LifeCycle.stop(_server);
} }
@Test @Test
@ -65,7 +71,7 @@ public class HeaderFilterTest
{ {
FilterHolder holder = new FilterHolder(HeaderFilter.class); FilterHolder holder = new FilterHolder(HeaderFilter.class);
holder.setInitParameter("headerConfig", "set X-Frame-Options: DENY"); holder.setInitParameter("headerConfig", "set X-Frame-Options: DENY");
_tester.getContext().getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST)); _context.getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
HttpTester.Request request = HttpTester.newRequest(); HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET"); request.setMethod("GET");
@ -73,7 +79,7 @@ public class HeaderFilterTest
request.setHeader("Host", "localhost"); request.setHeader("Host", "localhost");
request.setURI("/context/test/0"); request.setURI("/context/test/0");
HttpTester.Response response = HttpTester.parseResponse(_tester.getResponses(request.generate())); HttpTester.Response response = HttpTester.parseResponse(_connector.getResponse(request.generate()));
assertThat(response, containsHeaderValue("X-Frame-Options", "DENY")); assertThat(response, containsHeaderValue("X-Frame-Options", "DENY"));
} }
@ -82,7 +88,7 @@ public class HeaderFilterTest
{ {
FilterHolder holder = new FilterHolder(HeaderFilter.class); FilterHolder holder = new FilterHolder(HeaderFilter.class);
holder.setInitParameter("headerConfig", "add X-Frame-Options: DENY"); holder.setInitParameter("headerConfig", "add X-Frame-Options: DENY");
_tester.getContext().getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST)); _context.getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
HttpTester.Request request = HttpTester.newRequest(); HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET"); request.setMethod("GET");
@ -90,7 +96,7 @@ public class HeaderFilterTest
request.setHeader("Host", "localhost"); request.setHeader("Host", "localhost");
request.setURI("/context/test/0"); request.setURI("/context/test/0");
HttpTester.Response response = HttpTester.parseResponse(_tester.getResponses(request.generate())); HttpTester.Response response = HttpTester.parseResponse(_connector.getResponse(request.generate()));
assertThat(response, containsHeaderValue("X-Frame-Options", "DENY")); assertThat(response, containsHeaderValue("X-Frame-Options", "DENY"));
} }
@ -99,7 +105,7 @@ public class HeaderFilterTest
{ {
FilterHolder holder = new FilterHolder(HeaderFilter.class); FilterHolder holder = new FilterHolder(HeaderFilter.class);
holder.setInitParameter("headerConfig", "setDate Expires: 100"); holder.setInitParameter("headerConfig", "setDate Expires: 100");
_tester.getContext().getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST)); _context.getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
HttpTester.Request request = HttpTester.newRequest(); HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET"); request.setMethod("GET");
@ -107,7 +113,7 @@ public class HeaderFilterTest
request.setHeader("Host", "localhost"); request.setHeader("Host", "localhost");
request.setURI("/context/test/0"); request.setURI("/context/test/0");
HttpTester.Response response = HttpTester.parseResponse(_tester.getResponses(request.generate())); HttpTester.Response response = HttpTester.parseResponse(_connector.getResponse(request.generate()));
assertThat(response.toString(), HttpHeader.EXPIRES.asString(), is(in(response.getFieldNamesCollection()))); assertThat(response.toString(), HttpHeader.EXPIRES.asString(), is(in(response.getFieldNamesCollection())));
} }
@ -116,7 +122,7 @@ public class HeaderFilterTest
{ {
FilterHolder holder = new FilterHolder(HeaderFilter.class); FilterHolder holder = new FilterHolder(HeaderFilter.class);
holder.setInitParameter("headerConfig", "addDate Expires: 100"); holder.setInitParameter("headerConfig", "addDate Expires: 100");
_tester.getContext().getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST)); _context.getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
HttpTester.Request request = HttpTester.newRequest(); HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET"); request.setMethod("GET");
@ -124,7 +130,7 @@ public class HeaderFilterTest
request.setHeader("Host", "localhost"); request.setHeader("Host", "localhost");
request.setURI("/context/test/0"); request.setURI("/context/test/0");
HttpTester.Response response = HttpTester.parseResponse(_tester.getResponses(request.generate())); HttpTester.Response response = HttpTester.parseResponse(_connector.getResponse(request.generate()));
assertThat(response.toString(), HttpHeader.EXPIRES.asString(), is(in(response.getFieldNamesCollection()))); assertThat(response.toString(), HttpHeader.EXPIRES.asString(), is(in(response.getFieldNamesCollection())));
} }

View File

@ -31,8 +31,11 @@ import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.http.HttpStatus; import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.http.HttpTester; import org.eclipse.jetty.http.HttpTester;
import org.eclipse.jetty.server.LocalConnector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletTester; import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.util.component.LifeCycle;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -43,22 +46,25 @@ import static org.hamcrest.Matchers.not;
public class IncludeExcludeBasedFilterTest public class IncludeExcludeBasedFilterTest
{ {
private ServletTester _tester; private Server _server;
private LocalConnector _connector;
private ServletContextHandler _context;
@BeforeEach @BeforeEach
public void setUp() throws Exception public void setUp() throws Exception
{ {
_tester = new ServletTester(); _server = new Server();
_tester.setContextPath("/context"); _connector = new LocalConnector(_server);
_tester.addServlet(NullServlet.class, "/test/*"); _server.addConnector(_connector);
_context = new ServletContextHandler(_server, "/context");
_tester.start(); _context.addServlet(NullServlet.class, "/test/*");
_server.start();
} }
@AfterEach @AfterEach
public void tearDown() throws Exception public void tearDown()
{ {
_tester.stop(); LifeCycle.stop(_server);
} }
@Test @Test
@ -66,7 +72,7 @@ public class IncludeExcludeBasedFilterTest
{ {
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class); FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
holder.setInitParameter("includedPaths", "^/test/0$"); holder.setInitParameter("includedPaths", "^/test/0$");
_tester.getContext().getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST)); _context.getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
HttpTester.Request request = HttpTester.newRequest(); HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET"); request.setMethod("GET");
@ -74,7 +80,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost"); request.setHeader("Host", "localhost");
request.setURI("/context/test/0"); request.setURI("/context/test/0");
HttpTester.Response response = HttpTester.parseResponse(_tester.getResponses(request.generate())); HttpTester.Response response = HttpTester.parseResponse(_connector.getResponse(request.generate()));
assertThat(response, containsHeaderValue("X-Custom-Value", "1")); assertThat(response, containsHeaderValue("X-Custom-Value", "1"));
} }
@ -83,7 +89,7 @@ public class IncludeExcludeBasedFilterTest
{ {
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class); FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
holder.setInitParameter("includedPaths", "^/nomatchtest$"); holder.setInitParameter("includedPaths", "^/nomatchtest$");
_tester.getContext().getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST)); _context.getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
HttpTester.Request request = HttpTester.newRequest(); HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET"); request.setMethod("GET");
@ -91,7 +97,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost"); request.setHeader("Host", "localhost");
request.setURI("/context/test/0"); request.setURI("/context/test/0");
HttpTester.Response response = HttpTester.parseResponse(_tester.getResponses(request.generate())); HttpTester.Response response = HttpTester.parseResponse(_connector.getResponse(request.generate()));
assertThat(response, not(containsHeaderValue("X-Custom-Value", "1"))); assertThat(response, not(containsHeaderValue("X-Custom-Value", "1")));
} }
@ -100,7 +106,7 @@ public class IncludeExcludeBasedFilterTest
{ {
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class); FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
holder.setInitParameter("excludedPaths", "^/test/0$"); holder.setInitParameter("excludedPaths", "^/test/0$");
_tester.getContext().getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST)); _context.getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
HttpTester.Request request = HttpTester.newRequest(); HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET"); request.setMethod("GET");
@ -108,7 +114,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost"); request.setHeader("Host", "localhost");
request.setURI("/context/test/0"); request.setURI("/context/test/0");
HttpTester.Response response = HttpTester.parseResponse(_tester.getResponses(request.generate())); HttpTester.Response response = HttpTester.parseResponse(_connector.getResponse(request.generate()));
assertThat(response, not(containsHeaderValue("X-Custom-Value", "1"))); assertThat(response, not(containsHeaderValue("X-Custom-Value", "1")));
} }
@ -117,7 +123,7 @@ public class IncludeExcludeBasedFilterTest
{ {
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class); FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
holder.setInitParameter("excludedPaths", "^/nomatchtest$"); holder.setInitParameter("excludedPaths", "^/nomatchtest$");
_tester.getContext().getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST)); _context.getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
HttpTester.Request request = HttpTester.newRequest(); HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET"); request.setMethod("GET");
@ -125,7 +131,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost"); request.setHeader("Host", "localhost");
request.setURI("/context/test/0"); request.setURI("/context/test/0");
HttpTester.Response response = HttpTester.parseResponse(_tester.getResponses(request.generate())); HttpTester.Response response = HttpTester.parseResponse(_connector.getResponse(request.generate()));
assertThat(response, containsHeaderValue("X-Custom-Value", "1")); assertThat(response, containsHeaderValue("X-Custom-Value", "1"));
} }
@ -135,7 +141,7 @@ public class IncludeExcludeBasedFilterTest
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class); FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
holder.setInitParameter("includedPaths", "^/test/0$"); holder.setInitParameter("includedPaths", "^/test/0$");
holder.setInitParameter("excludedPaths", "^/test/0$"); holder.setInitParameter("excludedPaths", "^/test/0$");
_tester.getContext().getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST)); _context.getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
HttpTester.Request request = HttpTester.newRequest(); HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET"); request.setMethod("GET");
@ -143,7 +149,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost"); request.setHeader("Host", "localhost");
request.setURI("/context/test/0"); request.setURI("/context/test/0");
HttpTester.Response response = HttpTester.parseResponse(_tester.getResponses(request.generate())); HttpTester.Response response = HttpTester.parseResponse(_connector.getResponse(request.generate()));
assertThat(response, not(containsHeaderValue("X-Custom-Value", "1"))); assertThat(response, not(containsHeaderValue("X-Custom-Value", "1")));
} }
@ -152,7 +158,7 @@ public class IncludeExcludeBasedFilterTest
{ {
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class); FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
holder.setInitParameter("includedHttpMethods", "GET"); holder.setInitParameter("includedHttpMethods", "GET");
_tester.getContext().getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST)); _context.getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
HttpTester.Request request = HttpTester.newRequest(); HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET"); request.setMethod("GET");
@ -160,7 +166,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost"); request.setHeader("Host", "localhost");
request.setURI("/context/test/0"); request.setURI("/context/test/0");
HttpTester.Response response = HttpTester.parseResponse(_tester.getResponses(request.generate())); HttpTester.Response response = HttpTester.parseResponse(_connector.getResponse(request.generate()));
assertThat(response, containsHeaderValue("X-Custom-Value", "1")); assertThat(response, containsHeaderValue("X-Custom-Value", "1"));
} }
@ -169,7 +175,7 @@ public class IncludeExcludeBasedFilterTest
{ {
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class); FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
holder.setInitParameter("includedHttpMethods", "POST,PUT"); holder.setInitParameter("includedHttpMethods", "POST,PUT");
_tester.getContext().getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST)); _context.getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
HttpTester.Request request = HttpTester.newRequest(); HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET"); request.setMethod("GET");
@ -177,7 +183,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost"); request.setHeader("Host", "localhost");
request.setURI("/context/test/0"); request.setURI("/context/test/0");
HttpTester.Response response = HttpTester.parseResponse(_tester.getResponses(request.generate())); HttpTester.Response response = HttpTester.parseResponse(_connector.getResponse(request.generate()));
assertThat(response, not(containsHeaderValue("X-Custom-Value", "1"))); assertThat(response, not(containsHeaderValue("X-Custom-Value", "1")));
} }
@ -186,7 +192,7 @@ public class IncludeExcludeBasedFilterTest
{ {
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class); FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
holder.setInitParameter("excludedHttpMethods", "GET"); holder.setInitParameter("excludedHttpMethods", "GET");
_tester.getContext().getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST)); _context.getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
HttpTester.Request request = HttpTester.newRequest(); HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET"); request.setMethod("GET");
@ -194,7 +200,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost"); request.setHeader("Host", "localhost");
request.setURI("/context/test/0"); request.setURI("/context/test/0");
HttpTester.Response response = HttpTester.parseResponse(_tester.getResponses(request.generate())); HttpTester.Response response = HttpTester.parseResponse(_connector.getResponse(request.generate()));
assertThat(response, not(containsHeaderValue("X-Custom-Value", "1"))); assertThat(response, not(containsHeaderValue("X-Custom-Value", "1")));
} }
@ -203,7 +209,7 @@ public class IncludeExcludeBasedFilterTest
{ {
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class); FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
holder.setInitParameter("excludedHttpMethods", "POST,PUT"); holder.setInitParameter("excludedHttpMethods", "POST,PUT");
_tester.getContext().getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST)); _context.getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
HttpTester.Request request = HttpTester.newRequest(); HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET"); request.setMethod("GET");
@ -211,7 +217,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost"); request.setHeader("Host", "localhost");
request.setURI("/context/test/0"); request.setURI("/context/test/0");
HttpTester.Response response = HttpTester.parseResponse(_tester.getResponses(request.generate())); HttpTester.Response response = HttpTester.parseResponse(_connector.getResponse(request.generate()));
assertThat(response, containsHeaderValue("X-Custom-Value", "1")); assertThat(response, containsHeaderValue("X-Custom-Value", "1"));
} }
@ -220,7 +226,7 @@ public class IncludeExcludeBasedFilterTest
{ {
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class); FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
holder.setInitParameter("includedMimeTypes", "application/json"); holder.setInitParameter("includedMimeTypes", "application/json");
_tester.getContext().getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST)); _context.getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
HttpTester.Request request = HttpTester.newRequest(); HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET"); request.setMethod("GET");
@ -228,7 +234,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost"); request.setHeader("Host", "localhost");
request.setURI("/context/test/json.json"); request.setURI("/context/test/json.json");
HttpTester.Response response = HttpTester.parseResponse(_tester.getResponses(request.generate())); HttpTester.Response response = HttpTester.parseResponse(_connector.getResponse(request.generate()));
assertThat(response, containsHeaderValue("X-Custom-Value", "1")); assertThat(response, containsHeaderValue("X-Custom-Value", "1"));
} }
@ -237,7 +243,7 @@ public class IncludeExcludeBasedFilterTest
{ {
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class); FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
holder.setInitParameter("includedMimeTypes", "application/json"); holder.setInitParameter("includedMimeTypes", "application/json");
_tester.getContext().getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST)); _context.getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
HttpTester.Request request = HttpTester.newRequest(); HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET"); request.setMethod("GET");
@ -245,7 +251,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost"); request.setHeader("Host", "localhost");
request.setURI("/context/test/json.json?some=value"); request.setURI("/context/test/json.json?some=value");
HttpTester.Response response = HttpTester.parseResponse(_tester.getResponses(request.generate())); HttpTester.Response response = HttpTester.parseResponse(_connector.getResponse(request.generate()));
assertThat(response, containsHeaderValue("X-Custom-Value", "1")); assertThat(response, containsHeaderValue("X-Custom-Value", "1"));
} }
@ -254,7 +260,7 @@ public class IncludeExcludeBasedFilterTest
{ {
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class); FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
holder.setInitParameter("includedMimeTypes", "application/xml"); holder.setInitParameter("includedMimeTypes", "application/xml");
_tester.getContext().getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST)); _context.getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
HttpTester.Request request = HttpTester.newRequest(); HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET"); request.setMethod("GET");
@ -262,7 +268,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost"); request.setHeader("Host", "localhost");
request.setURI("/context/test/json.json"); request.setURI("/context/test/json.json");
HttpTester.Response response = HttpTester.parseResponse(_tester.getResponses(request.generate())); HttpTester.Response response = HttpTester.parseResponse(_connector.getResponse(request.generate()));
assertThat(response, not(containsHeaderValue("X-Custom-Value", "1"))); assertThat(response, not(containsHeaderValue("X-Custom-Value", "1")));
} }
@ -271,7 +277,7 @@ public class IncludeExcludeBasedFilterTest
{ {
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class); FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
holder.setInitParameter("includedMimeTypes", "application/json"); holder.setInitParameter("includedMimeTypes", "application/json");
_tester.getContext().getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST)); _context.getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
HttpTester.Request request = HttpTester.newRequest(); HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET"); request.setMethod("GET");
@ -279,7 +285,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost"); request.setHeader("Host", "localhost");
request.setURI("/context/test/abcdef"); request.setURI("/context/test/abcdef");
HttpTester.Response response = HttpTester.parseResponse(_tester.getResponses(request.generate())); HttpTester.Response response = HttpTester.parseResponse(_connector.getResponse(request.generate()));
assertThat(response, not(containsHeaderValue("X-Custom-Value", "1"))); assertThat(response, not(containsHeaderValue("X-Custom-Value", "1")));
} }
@ -288,7 +294,7 @@ public class IncludeExcludeBasedFilterTest
{ {
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class); FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
holder.setInitParameter("excludedMimeTypes", "application/json"); holder.setInitParameter("excludedMimeTypes", "application/json");
_tester.getContext().getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST)); _context.getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
HttpTester.Request request = HttpTester.newRequest(); HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET"); request.setMethod("GET");
@ -296,7 +302,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost"); request.setHeader("Host", "localhost");
request.setURI("/context/test/json.json"); request.setURI("/context/test/json.json");
HttpTester.Response response = HttpTester.parseResponse(_tester.getResponses(request.generate())); HttpTester.Response response = HttpTester.parseResponse(_connector.getResponse(request.generate()));
assertThat(response, not(containsHeaderValue("X-Custom-Value", "1"))); assertThat(response, not(containsHeaderValue("X-Custom-Value", "1")));
} }
@ -305,7 +311,7 @@ public class IncludeExcludeBasedFilterTest
{ {
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class); FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
holder.setInitParameter("excludedMimeTypes", "application/xml"); holder.setInitParameter("excludedMimeTypes", "application/xml");
_tester.getContext().getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST)); _context.getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
HttpTester.Request request = HttpTester.newRequest(); HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET"); request.setMethod("GET");
@ -313,7 +319,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost"); request.setHeader("Host", "localhost");
request.setURI("/context/test/json.json"); request.setURI("/context/test/json.json");
HttpTester.Response response = HttpTester.parseResponse(_tester.getResponses(request.generate())); HttpTester.Response response = HttpTester.parseResponse(_connector.getResponse(request.generate()));
assertThat(response, containsHeaderValue("X-Custom-Value", "1")); assertThat(response, containsHeaderValue("X-Custom-Value", "1"));
} }

View File

@ -32,13 +32,18 @@ import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.http.HttpTester; import org.eclipse.jetty.http.HttpTester;
import org.eclipse.jetty.server.LocalConnector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletTester; import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDir; import org.eclipse.jetty.toolchain.test.jupiter.WorkDir;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension; import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension;
import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.IO; import org.eclipse.jetty.util.IO;
import org.eclipse.jetty.util.StringUtil; import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.component.LifeCycle;
import org.eclipse.jetty.util.resource.PathResource; import org.eclipse.jetty.util.resource.PathResource;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
@ -58,29 +63,33 @@ public class PutFilterTest
{ {
public WorkDir workDir; public WorkDir workDir;
private Path root; private Path root;
private ServletTester tester; private Server server;
private LocalConnector connector;
@BeforeEach @BeforeEach
public void setUp() throws Exception public void setUp() throws Exception
{ {
root = workDir.getEmptyPathDir(); root = workDir.getEmptyPathDir();
tester = new ServletTester("/context"); server = new Server();
tester.setBaseResource(new PathResource(root)); connector = new LocalConnector(server);
tester.addServlet(org.eclipse.jetty.servlet.DefaultServlet.class, "/"); server.addConnector(connector);
FilterHolder holder = tester.addFilter(PutFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); ServletContextHandler context = new ServletContextHandler(server, "/context");
context.setBaseResource(new PathResource(root));
context.addServlet(DefaultServlet.class, "/");
FilterHolder holder = context.addFilter(PutFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
holder.setInitParameter("delAllowed", "true"); holder.setInitParameter("delAllowed", "true");
tester.setAttribute(ServletContext.TEMPDIR, workDir.getPath().toFile()); context.setAttribute(ServletContext.TEMPDIR, workDir.getPath().toFile());
// Bloody Windows does not allow file renaming // Bloody Windows does not allow file renaming.
if (!System.getProperty("os.name").toLowerCase(Locale.ENGLISH).contains("windows")) if (!System.getProperty("os.name").toLowerCase(Locale.ENGLISH).contains("windows"))
holder.setInitParameter("putAtomic", "true"); holder.setInitParameter("putAtomic", "true");
tester.start(); server.start();
} }
@AfterEach @AfterEach
public void tearDown() throws Exception public void tearDown()
{ {
tester.stop(); LifeCycle.stop(server);
} }
@Test @Test
@ -95,7 +104,7 @@ public class PutFilterTest
request.setVersion("HTTP/1.0"); request.setVersion("HTTP/1.0");
request.setHeader("Host", "tester"); request.setHeader("Host", "tester");
request.setURI("/context/file.txt"); request.setURI("/context/file.txt");
response = HttpTester.parseResponse(tester.getResponses(request.generate())); response = HttpTester.parseResponse(connector.getResponse(request.generate()));
assertEquals(HttpServletResponse.SC_NOT_FOUND, response.getStatus()); assertEquals(HttpServletResponse.SC_NOT_FOUND, response.getStatus());
// test PUT0 // test PUT0
@ -104,7 +113,7 @@ public class PutFilterTest
request.setHeader("Content-Type", "text/plain"); request.setHeader("Content-Type", "text/plain");
String data0 = "Now is the time for all good men to come to the aid of the party"; String data0 = "Now is the time for all good men to come to the aid of the party";
request.setContent(data0); request.setContent(data0);
response = HttpTester.parseResponse(tester.getResponses(request.generate())); response = HttpTester.parseResponse(connector.getResponse(request.generate()));
assertEquals(HttpServletResponse.SC_CREATED, response.getStatus()); assertEquals(HttpServletResponse.SC_CREATED, response.getStatus());
Path file = root.resolve("file.txt"); Path file = root.resolve("file.txt");
@ -116,7 +125,7 @@ public class PutFilterTest
request.setVersion("HTTP/1.0"); request.setVersion("HTTP/1.0");
request.setHeader("Host", "tester"); request.setHeader("Host", "tester");
request.setURI("/context/file.txt"); request.setURI("/context/file.txt");
response = HttpTester.parseResponse(tester.getResponses(request.generate())); response = HttpTester.parseResponse(connector.getResponse(request.generate()));
assertEquals(HttpServletResponse.SC_OK, response.getStatus()); assertEquals(HttpServletResponse.SC_OK, response.getStatus());
assertEquals(data0, response.getContent()); assertEquals(data0, response.getContent());
@ -126,7 +135,7 @@ public class PutFilterTest
request.setHeader("Content-Type", "text/plain"); request.setHeader("Content-Type", "text/plain");
String data1 = "How Now BROWN COW!!!!"; String data1 = "How Now BROWN COW!!!!";
request.setContent(data1); request.setContent(data1);
response = HttpTester.parseResponse(tester.getResponses(request.generate())); response = HttpTester.parseResponse(connector.getResponse(request.generate()));
assertEquals(HttpServletResponse.SC_OK, response.getStatus()); assertEquals(HttpServletResponse.SC_OK, response.getStatus());
file = root.resolve("file.txt"); file = root.resolve("file.txt");
@ -140,7 +149,11 @@ public class PutFilterTest
String data2 = "Blah blah blah Blah blah"; String data2 = "Blah blah blah Blah blah";
request.setContent(data2); request.setContent(data2);
String toSend = BufferUtil.toString(request.generate()); String toSend = BufferUtil.toString(request.generate());
URL url = new URL(tester.createConnector(true));
ServerConnector serverConnector = new ServerConnector(server);
server.addConnector(connector);
serverConnector.start();
URL url = new URL("http://localhost:" + serverConnector.getLocalPort());
Socket socket = new Socket(url.getHost(), url.getPort()); Socket socket = new Socket(url.getHost(), url.getPort());
OutputStream out = socket.getOutputStream(); OutputStream out = socket.getOutputStream();
int l = toSend.length(); int l = toSend.length();
@ -161,22 +174,25 @@ public class PutFilterTest
request.setVersion("HTTP/1.0"); request.setVersion("HTTP/1.0");
request.setHeader("Host", "tester"); request.setHeader("Host", "tester");
request.setURI("/context/file.txt"); request.setURI("/context/file.txt");
response = HttpTester.parseResponse(tester.getResponses(request.generate())); response = HttpTester.parseResponse(connector.getResponse(request.generate()));
} }
while (response.getStatus() == 200); while (response.getStatus() == 200);
assertEquals(HttpServletResponse.SC_NOT_FOUND, response.getStatus()); assertEquals(HttpServletResponse.SC_NOT_FOUND, response.getStatus());
out.write(toSend.substring(l - 5).getBytes()); out.write(toSend.substring(l - 5).getBytes());
out.flush(); out.flush();
String in = IO.toString(socket.getInputStream()); IO.copy(socket.getInputStream(), IO.getNullStream());
request.setMethod("GET"); request.setMethod("GET");
request.setVersion("HTTP/1.0"); request.setVersion("HTTP/1.0");
request.setHeader("Host", "tester"); request.setHeader("Host", "tester");
request.setURI("/context/file.txt"); request.setURI("/context/file.txt");
response = HttpTester.parseResponse(tester.getResponses(request.generate())); response = HttpTester.parseResponse(connector.getResponse(request.generate()));
assertEquals(HttpServletResponse.SC_OK, response.getStatus()); assertEquals(HttpServletResponse.SC_OK, response.getStatus());
assertEquals(data2, response.getContent()); assertEquals(data2, response.getContent());
serverConnector.stop();
server.removeConnector(serverConnector);
} }
@Test @Test
@ -194,7 +210,7 @@ public class PutFilterTest
request.setHeader("Content-Type", "text/plain"); request.setHeader("Content-Type", "text/plain");
String data1 = "How Now BROWN COW!!!!"; String data1 = "How Now BROWN COW!!!!";
request.setContent(data1); request.setContent(data1);
response = HttpTester.parseResponse(tester.getResponses(request.generate())); response = HttpTester.parseResponse(connector.getResponse(request.generate()));
assertEquals(HttpServletResponse.SC_CREATED, response.getStatus()); assertEquals(HttpServletResponse.SC_CREATED, response.getStatus());
Path file = root.resolve("file.txt"); Path file = root.resolve("file.txt");
@ -203,14 +219,14 @@ public class PutFilterTest
request.setMethod("DELETE"); request.setMethod("DELETE");
request.setURI("/context/file.txt"); request.setURI("/context/file.txt");
response = HttpTester.parseResponse(tester.getResponses(request.generate())); response = HttpTester.parseResponse(connector.getResponse(request.generate()));
assertEquals(HttpServletResponse.SC_NO_CONTENT, response.getStatus()); assertEquals(HttpServletResponse.SC_NO_CONTENT, response.getStatus());
assertFalse(Files.exists(file)); assertFalse(Files.exists(file));
request.setMethod("DELETE"); request.setMethod("DELETE");
request.setURI("/context/file.txt"); request.setURI("/context/file.txt");
response = HttpTester.parseResponse(tester.getResponses(request.generate())); response = HttpTester.parseResponse(connector.getResponse(request.generate()));
assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus());
} }
@ -229,7 +245,7 @@ public class PutFilterTest
request.setHeader("Content-Type", "text/plain"); request.setHeader("Content-Type", "text/plain");
String data1 = "How Now BROWN COW!!!!"; String data1 = "How Now BROWN COW!!!!";
request.setContent(data1); request.setContent(data1);
response = HttpTester.parseResponse(tester.getResponses(request.generate())); response = HttpTester.parseResponse(connector.getResponse(request.generate()));
assertEquals(HttpServletResponse.SC_CREATED, response.getStatus()); assertEquals(HttpServletResponse.SC_CREATED, response.getStatus());
@ -240,7 +256,7 @@ public class PutFilterTest
request.setMethod("MOVE"); request.setMethod("MOVE");
request.setURI("/context/file.txt"); request.setURI("/context/file.txt");
request.setHeader("new-uri", "/context/blah.txt"); request.setHeader("new-uri", "/context/blah.txt");
response = HttpTester.parseResponse(tester.getResponses(request.generate())); response = HttpTester.parseResponse(connector.getResponse(request.generate()));
assertEquals(HttpServletResponse.SC_NO_CONTENT, response.getStatus()); assertEquals(HttpServletResponse.SC_NO_CONTENT, response.getStatus());
assertFalse(Files.exists(file)); assertFalse(Files.exists(file));
@ -261,12 +277,11 @@ public class PutFilterTest
request.setVersion("HTTP/1.0"); request.setVersion("HTTP/1.0");
request.put("Host", "tester"); request.put("Host", "tester");
request.setURI("/context/file.txt"); request.setURI("/context/file.txt");
response = HttpTester.parseResponse(tester.getResponses(request.generate())); response = HttpTester.parseResponse(connector.getResponse(request.generate()));
assertEquals(HttpServletResponse.SC_OK, response.getStatus()); assertEquals(HttpServletResponse.SC_OK, response.getStatus());
Set<String> options = new HashSet<String>();
String allow = response.get("Allow"); String allow = response.get("Allow");
options.addAll(StringUtil.csvSplit(null, allow, 0, allow.length())); Set<String> options = new HashSet<>(StringUtil.csvSplit(null, allow, 0, allow.length()));
assertThat("GET", is(in(options))); assertThat("GET", is(in(options)));
assertThat("POST", is(in(options))); assertThat("POST", is(in(options)));
assertThat("PUT", is(in(options))); assertThat("PUT", is(in(options)));

View File

@ -37,9 +37,12 @@ import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.http.HttpTester; import org.eclipse.jetty.http.HttpTester;
import org.eclipse.jetty.server.LocalConnector; import org.eclipse.jetty.server.LocalConnector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletTester; import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.component.LifeCycle;
import org.hamcrest.Matchers; import org.hamcrest.Matchers;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
@ -56,8 +59,9 @@ public class QoSFilterTest
{ {
private static final Logger LOG = LoggerFactory.getLogger(QoSFilterTest.class); private static final Logger LOG = LoggerFactory.getLogger(QoSFilterTest.class);
private ServletTester _tester; private Server server;
private LocalConnector[] _connectors; private LocalConnector[] _connectors;
private ServletContextHandler context;
private final int numConnections = 8; private final int numConnections = 8;
private final int numLoops = 6; private final int numLoops = 6;
private final int maxQos = 4; private final int maxQos = 4;
@ -65,25 +69,26 @@ public class QoSFilterTest
@BeforeEach @BeforeEach
public void setUp() throws Exception public void setUp() throws Exception
{ {
_tester = new ServletTester(); server = new Server();
_tester.setContextPath("/context"); context = new ServletContextHandler(server, "/context");
_tester.addServlet(TestServlet.class, "/test"); context.addServlet(TestServlet.class, "/test");
TestServlet.__maxSleepers = 0; TestServlet.__maxSleepers = 0;
TestServlet.__sleepers = 0; TestServlet.__sleepers = 0;
_connectors = new LocalConnector[numConnections]; _connectors = new LocalConnector[numConnections];
for (int i = 0; i < _connectors.length; ++i) for (int i = 0; i < _connectors.length; ++i)
{ {
_connectors[i] = _tester.createLocalConnector(); _connectors[i] = new LocalConnector(server);
server.addConnector(_connectors[i]);
} }
_tester.start(); server.start();
} }
@AfterEach @AfterEach
public void tearDown() throws Exception public void tearDown()
{ {
_tester.stop(); LifeCycle.stop(server);
} }
@Test @Test
@ -113,7 +118,7 @@ public class QoSFilterTest
FilterHolder holder = new FilterHolder(QoSFilter2.class); FilterHolder holder = new FilterHolder(QoSFilter2.class);
holder.setAsyncSupported(true); holder.setAsyncSupported(true);
holder.setInitParameter(QoSFilter.MAX_REQUESTS_INIT_PARAM, "" + maxQos); holder.setInitParameter(QoSFilter.MAX_REQUESTS_INIT_PARAM, "" + maxQos);
_tester.getContext().getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC)); context.getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC));
List<Worker> workers = new ArrayList<>(); List<Worker> workers = new ArrayList<>();
for (int i = 0; i < numConnections; ++i) for (int i = 0; i < numConnections; ++i)
@ -138,7 +143,7 @@ public class QoSFilterTest
FilterHolder holder = new FilterHolder(QoSFilter2.class); FilterHolder holder = new FilterHolder(QoSFilter2.class);
holder.setAsyncSupported(true); holder.setAsyncSupported(true);
holder.setInitParameter(QoSFilter.MAX_REQUESTS_INIT_PARAM, String.valueOf(maxQos)); holder.setInitParameter(QoSFilter.MAX_REQUESTS_INIT_PARAM, String.valueOf(maxQos));
_tester.getContext().getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC)); context.getServletHandler().addFilterWithMapping(holder, "/*", EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC));
List<Worker2> workers = new ArrayList<>(); List<Worker2> workers = new ArrayList<>();
for (int i = 0; i < numConnections; ++i) for (int i = 0; i < numConnections; ++i)
@ -167,7 +172,7 @@ public class QoSFilterTest
class Worker implements Callable<Void> class Worker implements Callable<Void>
{ {
private int _num; private final int _num;
public Worker(int num) public Worker(int num)
{ {
@ -195,11 +200,11 @@ public class QoSFilterTest
} }
} }
class Worker2 implements Callable<Void> private class Worker2 implements Callable<Void>
{ {
private int _num; private final int _num;
public Worker2(int num) private Worker2(int num)
{ {
_num = num; _num = num;
} }
@ -208,9 +213,14 @@ public class QoSFilterTest
public Void call() throws Exception public Void call() throws Exception
{ {
URL url = null; URL url = null;
ServerConnector connector = null;
try try
{ {
String addr = _tester.createConnector(true); connector = new ServerConnector(server);
server.addConnector(connector);
connector.start();
String addr = "http://localhost:" + connector.getLocalPort();
for (int i = 0; i < numLoops; i++) for (int i = 0; i < numLoops; i++)
{ {
url = new URL(addr + "/context/test?priority=" + (_num % QoSFilter.__DEFAULT_MAX_PRIORITY) + "&n=" + _num + "&l=" + i); url = new URL(addr + "/context/test?priority=" + (_num % QoSFilter.__DEFAULT_MAX_PRIORITY) + "&n=" + _num + "&l=" + i);
@ -221,7 +231,14 @@ public class QoSFilterTest
{ {
LOG.debug("Request " + url + " failed", e); LOG.debug("Request " + url + " failed", e);
} }
finally
{
if (connector != null)
{
connector.stop();
server.removeConnector(connector);
}
}
return null; return null;
} }
} }

View File

@ -1,6 +1,5 @@
# Jetty Logging using jetty-slf4j-impl # Jetty Logging using jetty-slf4j-impl
#org.eclipse.jetty.LEVEL=DEBUG #org.eclipse.jetty.LEVEL=DEBUG
#org.eclipse.jetty.servlets.LEVEL=DEBUG #org.eclipse.jetty.servlets.LEVEL=DEBUG
#org.eclipse.jetty.servlet.ServletTester.LEVEL=DEBUG
#org.eclipse.jetty.servlets.QoSFilter.LEVEL=DEBUG #org.eclipse.jetty.servlets.QoSFilter.LEVEL=DEBUG
#org.eclipse.jetty.servlets.DoSFilter.LEVEL=DEBUG #org.eclipse.jetty.servlets.DoSFilter.LEVEL=DEBUG