Merge pull request #5729 from eclipse/jetty-10.0.x-3080-no_classifier_tests

Fixes #3080 - Do not create and use jars with "tests" classifier.
This commit is contained in:
Simone Bordet 2020-11-26 11:22:03 +01:00 committed by GitHub
commit ac3d492305
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 389 additions and 339 deletions

View File

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

View File

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

View File

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

View File

@ -19,8 +19,10 @@
package org.eclipse.jetty;
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.ServletTester;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@ -30,23 +32,25 @@ import static org.hamcrest.Matchers.is;
public class ChatServletTest
{
private final ServletTester tester = new ServletTester();
private Server server;
private LocalConnector connector;
@BeforeEach
public void setUp() throws Exception
{
tester.setContextPath("/");
ServletHolder dispatch = tester.addServlet(ChatServlet.class, "/chat/*");
server = new Server();
connector = new LocalConnector(server);
server.addConnector(connector);
ServletContextHandler context = new ServletContextHandler(server, "/");
ServletHolder dispatch = context.addServlet(ChatServlet.class, "/chat/*");
dispatch.setInitParameter("asyncTimeout", "500");
tester.start();
server.start();
}
@AfterEach
public void tearDown() throws Exception
{
tester.stop();
server.stop();
}
@Test
@ -59,7 +63,7 @@ public class ChatServletTest
public void testChat() throws Exception
{
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
}
@ -71,20 +75,18 @@ public class ChatServletTest
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));
}
private String createRequestString(String body)
{
StringBuilder req1 = new StringBuilder();
req1.append("POST /chat/ HTTP/1.1\r\n");
req1.append("Host: tester\r\n");
req1.append("Content-length: " + body.length() + "\r\n");
req1.append("Content-type: application/x-www-form-urlencoded\r\n");
req1.append("Connection: close\r\n");
req1.append("\r\n");
req1.append(body);
return req1.toString();
return "POST /chat/ HTTP/1.1\r\n" +
"Host: tester\r\n" +
"Content-length: " + body.length() + "\r\n" +
"Content-type: application/x-www-form-urlencoded\r\n" +
"Connection: close\r\n" +
"\r\n" +
body;
}
}

View File

@ -19,10 +19,15 @@
package org.eclipse.jetty;
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.ServletContextHandler;
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.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
@ -34,6 +39,26 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
*/
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.
*
@ -71,20 +96,14 @@ public class DispatchServletTest
@Test
public void testSelfRefForwardDenialOfService() throws Exception
{
ServletTester tester = new ServletTester();
tester.setContextPath("/tests");
ServletHolder dispatch = context.addServlet(DispatchServlet.class, "/dispatch/*");
context.addServlet(DefaultServlet.class, "/");
ServletHolder dispatch = tester.addServlet(DispatchServlet.class, "/dispatch/*");
tester.addServlet(DefaultServlet.class, "/");
tester.start();
StringBuilder req1 = new StringBuilder();
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 request = "GET /tests/dispatch/includeN/" + dispatch.getName() + " HTTP/1.1\n" +
"Host: tester\n" +
"Connection: close\n" +
"\n";
String response = connector.getResponse(request);
String msg = "Response code on SelfRefDoS";
@ -95,11 +114,8 @@ public class DispatchServletTest
@Test
public void testSelfRefDeep() throws Exception
{
ServletTester tester = new ServletTester();
tester.setContextPath("/tests");
tester.addServlet(DispatchServlet.class, "/dispatch/*");
tester.addServlet(DefaultServlet.class, "/");
tester.start();
context.addServlet(DispatchServlet.class, "/dispatch/*");
context.addServlet(DefaultServlet.class, "/");
String[] selfRefs =
{"/dispatch/forward", "/dispatch/includeS", "/dispatch/includeW", "/dispatch/includeN",};
@ -113,19 +129,13 @@ public class DispatchServletTest
for (String selfRef : selfRefs)
{
StringBuilder req1 = new StringBuilder();
req1.append("GET /tests");
for (int i = 0; i < nestedDepth; i++)
{
req1.append(selfRef);
}
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());
String request = "GET /tests" +
selfRef.repeat(nestedDepth) +
"/ HTTP/1.1\n" +
"Host: tester\n" +
"Connection: close\n" +
"\n";
String response = connector.getResponse(request);
StringBuilder msg = new StringBuilder();
msg.append("Response code on nested \"").append(selfRef).append("\"");

View File

@ -16,19 +16,6 @@
<build>
<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>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>

View File

@ -26,18 +26,6 @@
</argLine>
</configuration>
</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>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>

View File

@ -28,6 +28,7 @@ import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.Servlet;
import org.eclipse.jetty.http.HttpTester;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.LocalConnector;
import org.eclipse.jetty.server.Server;
@ -39,6 +40,51 @@ import org.eclipse.jetty.util.resource.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* <p>ServletTester is not best practice and may be deprecated and eventually
* removed in future Jetty versions.</p>
* <p>ServletTester is a just a wrapper around a {@link ServletContextHandler},
* with a {@link LocalConnector} to accept HTTP/1.1 requests, so there is no
* value that this class adds to already existing classes.</p>
* <p>Replace its usages with:</p>
* <pre>
* Server server = new Server();
* LocalConnector connector = new LocalConnector(server);
* server.addConnector(connector);
* ServletContextHandler context = new ServletContextHandler(server, "/contextPath");
* // Configure the context here.
* server.start();
* </pre>
* <p>You can configure the context by adding Servlets and Filters, attributes,
* etc. even after it has been started.
* Use {@link HttpTester} and {@link LocalConnector} to make HTTP/1.1 requests,
* in this way:</p>
* <pre>
* // Generate the request.
* HttpTester.Request request = HttpTester.newRequest();
* request.setMethod("GET");
* request.setURI("/contextPath/servletPath");
* request.put(HttpHeader.HOST, "localhost");
* ByteBuffer requestBuffer = request.generate();
*
* // Send the request buffer and get the response buffer.
* ByteBuffer responseBuffer = connector.getResponse(requestBuffer);
*
* // Parse the response buffer.
* HttpTester.Response response = HttpTester.parseResponse(responseBuffer);
* assert response.getStatus() == HttpStatus.OK_200;
* </pre>
* <p>Alternatively, you can use <em>raw</em> strings for requests and responses,
* but you must be sure the request strings are in the correct HTTP/1.1 format:</p>
* <pre>
* String rawRequest = "" +
* "GET /contextPath/servletPath HTTP/1.1\r\n" +
* "Host: localhost\r\n" +
* "\r\n";
* String rawResponse = connector.getResponse(rawRequest);
* HttpTester.Response response = HttpTester.parseResponse(rawResponse);
* </pre>
*/
public class ServletTester extends ContainerLifeCycle
{
private static final Logger LOG = LoggerFactory.getLogger(ServletTester.class);

View File

@ -84,13 +84,6 @@
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>${project.version}</version>
<classifier>tests</classifier>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.toolchain</groupId>
<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.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.FileSessionDataStore;
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.jupiter.WorkDir;
import org.eclipse.jetty.util.IO;
import org.eclipse.jetty.util.component.LifeCycle;
import org.hamcrest.Matchers;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
@ -53,16 +55,18 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
public abstract class AbstractDoSFilterTest
{
protected ServletTester _tester;
protected String _host;
protected int _port;
private Server _server;
private ServerConnector _connector;
protected long _requestMaxTime = 200;
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();
Path p = workDir.getPathFile("sessions");
@ -70,15 +74,11 @@ public abstract class AbstractDoSFilterTest
fileStore.setStoreDir(p.toFile());
sessionCache.setSessionDataStore(fileStore);
_tester.getContext().getSessionHandler().setSessionCache(sessionCache);
context.getSessionHandler().setSessionCache(sessionCache);
HttpURI uri = HttpURI.from(_tester.createConnector(true));
_host = uri.getHost();
_port = uri.getPort();
context.addServlet(TestServlet.class, "/*");
_tester.getContext().addServlet(TestServlet.class, "/*");
FilterHolder dosFilter = _tester.getContext().addFilter(filter, "/dos/*", EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC));
FilterHolder dosFilter = context.addFilter(filter, "/dos/*", EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC));
dosFilter.setInitParameter("maxRequestsPerSec", "4");
dosFilter.setInitParameter("delayMs", "200");
dosFilter.setInitParameter("throttledRequests", "1");
@ -87,7 +87,7 @@ public abstract class AbstractDoSFilterTest
dosFilter.setInitParameter("remotePort", "false");
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("delayMs", "200");
timeoutFilter.setInitParameter("throttledRequests", "1");
@ -97,18 +97,18 @@ public abstract class AbstractDoSFilterTest
timeoutFilter.setInitParameter("insertHeaders", "true");
timeoutFilter.setInitParameter("maxRequestMs", _requestMaxTime + "");
_tester.start();
_server.start();
}
@AfterEach
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
{
try (Socket socket = new Socket(_host, _port))
try (Socket socket = new Socket("localhost", _connector.getLocalPort()))
{
socket.setSoTimeout(30000);
@ -188,24 +188,20 @@ public abstract class AbstractDoSFilterTest
@Test
public void testThrottledIP() throws Exception
{
Thread other = new Thread()
Thread other = new Thread(() ->
{
@Override
public void run()
try
{
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";
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();
}
// Cause a delay, then sleep while holding pass
String request = "GET /ctx/dos/sleeper HTTP/1.1\r\nHost: localhost\r\n\r\n";
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();
}
});
other.start();
Thread.sleep(1500);
@ -224,24 +220,20 @@ public abstract class AbstractDoSFilterTest
@Test
public void testUnavailableIP() throws Exception
{
Thread other = new Thread()
Thread other = new Thread(() ->
{
@Override
public void run()
try
{
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";
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();
}
// Cause a delay, then sleep while holding pass
String request = "GET /ctx/dos/test HTTP/1.1\r\nHost: localhost\r\n\r\n";
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();
}
});
other.start();
Thread.sleep(500);
@ -350,7 +342,7 @@ public abstract class AbstractDoSFilterTest
int count = Integer.parseInt(request.getParameter("lines"));
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();
try

View File

@ -31,10 +31,13 @@ import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.http.HttpStatus;
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.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.servlet.ServletTester;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.component.LifeCycle;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@ -48,36 +51,40 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
public class CrossOriginFilterTest
{
private ServletTester tester;
private Server server;
private LocalConnector connector;
private ServletContextHandler context;
@BeforeEach
public void init() throws Exception
{
tester = new ServletTester();
tester.start();
server = new Server();
connector = new LocalConnector(server);
server.addConnector(connector);
context = new ServletContextHandler(server, "/");
server.start();
}
@AfterEach
public void destroy() throws Exception
public void destroy()
{
if (tester != null)
tester.stop();
LifeCycle.stop(server);
}
@Test
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);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request =
"GET / HTTP/1.1\r\n" +
"Host: localhost\r\n" +
"Connection: close\r\n" +
"\r\n";
String rawResponse = tester.getResponses(request);
String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -90,10 +97,10 @@ public class CrossOriginFilterTest
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
String origin = "http://localhost";
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);
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 request =
@ -102,7 +109,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" +
"Origin: " + otherOrigin + "\r\n" +
"\r\n";
String rawResponse = tester.getResponses(request);
String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -116,10 +123,10 @@ public class CrossOriginFilterTest
public void testSimpleRequestWithWildcardOrigin() throws Exception
{
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);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String origin = "http://foo.example.com";
String request =
@ -128,7 +135,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" +
"Origin: " + origin + "\r\n" +
"\r\n";
String rawResponse = tester.getResponses(request);
String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -145,10 +152,10 @@ public class CrossOriginFilterTest
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
String origin = "http://subdomain.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);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request =
"GET / HTTP/1.1\r\n" +
@ -156,7 +163,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" +
"Origin: " + origin + "\r\n" +
"\r\n";
String rawResponse = tester.getResponses(request);
String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -174,10 +181,10 @@ public class CrossOriginFilterTest
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
String origin = "http://subdomain.subdomain.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);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request =
"GET / HTTP/1.1\r\n" +
@ -185,7 +192,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" +
"Origin: " + origin + "\r\n" +
"\r\n";
String rawResponse = tester.getResponses(request);
String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -202,10 +209,10 @@ public class CrossOriginFilterTest
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
String origin = "http://localhost";
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);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request =
"GET / HTTP/1.1\r\n" +
@ -213,7 +220,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" +
"Origin: " + origin + "\r\n" +
"\r\n";
String rawResponse = tester.getResponses(request);
String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -233,10 +240,10 @@ public class CrossOriginFilterTest
String timingOrigin = "http://127.0.0.1";
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, origin);
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);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request =
"GET / HTTP/1.1\r\n" +
@ -244,7 +251,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" +
"Origin: " + origin + "\r\n" +
"\r\n";
String response = tester.getResponses(request);
String response = connector.getResponse(request);
assertTrue(response.contains("HTTP/1.1 200"));
assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER));
assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER));
@ -260,10 +267,10 @@ public class CrossOriginFilterTest
String origin = "http://localhost";
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_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);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request =
"GET / HTTP/1.1\r\n" +
@ -271,7 +278,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" +
"Origin: " + origin + "\r\n" +
"\r\n";
String response = tester.getResponses(request);
String response = connector.getResponse(request);
assertTrue(response.contains("HTTP/1.1 200"));
assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER));
assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER));
@ -287,10 +294,10 @@ public class CrossOriginFilterTest
String origin = "http://localhost";
String otherOrigin = StringUtil.replace(origin, "localhost", "127.0.0.1");
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);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request =
"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
"Origin: " + otherOrigin + " " + " " + origin + "\r\n" +
"\r\n";
String rawResponse = tester.getResponses(request);
String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -315,10 +322,10 @@ public class CrossOriginFilterTest
{
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
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);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request =
"GET / HTTP/1.1\r\n" +
@ -326,7 +333,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" +
"Origin: http://localhost\r\n" +
"\r\n";
String rawResponse = tester.getResponses(request);
String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -344,10 +351,10 @@ public class CrossOriginFilterTest
// will contain the CORS response headers.
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);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request =
"PUT / HTTP/1.1\r\n" +
@ -355,7 +362,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" +
"Origin: http://localhost\r\n" +
"\r\n";
String rawResponse = tester.getResponses(request);
String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -373,10 +380,10 @@ public class CrossOriginFilterTest
// will contain the CORS response headers.
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);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request =
"OPTIONS / HTTP/1.1\r\n" +
@ -384,7 +391,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" +
"Origin: http://localhost\r\n" +
"\r\n";
String rawResponse = tester.getResponses(request);
String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -399,10 +406,10 @@ public class CrossOriginFilterTest
{
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
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);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request =
"OPTIONS / HTTP/1.1\r\n" +
@ -412,7 +419,7 @@ public class CrossOriginFilterTest
CrossOriginFilter.ACCESS_CONTROL_REQUEST_METHOD_HEADER + ": GET\r\n" +
"Origin: http://localhost\r\n" +
"\r\n";
String rawResponse = tester.getResponses(request);
String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -428,10 +435,10 @@ public class CrossOriginFilterTest
{
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
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);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
// Preflight request
String request =
@ -441,7 +448,7 @@ public class CrossOriginFilterTest
CrossOriginFilter.ACCESS_CONTROL_REQUEST_METHOD_HEADER + ": PUT\r\n" +
"Origin: http://localhost\r\n" +
"\r\n";
String rawResponse = tester.getResponses(request);
String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -460,7 +467,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" +
"Origin: http://localhost\r\n" +
"\r\n";
rawResponse = tester.getResponses(request);
rawResponse = connector.getResponse(request);
response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -475,10 +482,10 @@ public class CrossOriginFilterTest
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
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");
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
CountDownLatch latch = new CountDownLatch(1);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
// Preflight request
String request =
@ -489,7 +496,7 @@ public class CrossOriginFilterTest
CrossOriginFilter.ACCESS_CONTROL_REQUEST_HEADERS_HEADER + ": origin,x-custom,x-requested-with\r\n" +
"Origin: http://localhost\r\n" +
"\r\n";
String rawResponse = tester.getResponses(request);
String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -511,7 +518,7 @@ public class CrossOriginFilterTest
"X-Requested-With: local\r\n" +
"Origin: http://localhost\r\n" +
"\r\n";
rawResponse = tester.getResponses(request);
rawResponse = connector.getResponse(request);
response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -525,10 +532,10 @@ public class CrossOriginFilterTest
{
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
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);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
// Preflight request
String request =
@ -539,7 +546,7 @@ public class CrossOriginFilterTest
CrossOriginFilter.ACCESS_CONTROL_REQUEST_HEADERS_HEADER + ": origin,x-custom,x-requested-with\r\n" +
"Origin: http://localhost\r\n" +
"\r\n";
String rawResponse = tester.getResponses(request);
String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -554,10 +561,10 @@ public class CrossOriginFilterTest
public void testCrossOriginFilterDisabledForWebSocketUpgrade() throws Exception
{
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);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request =
"GET / HTTP/1.1\r\n" +
@ -566,7 +573,7 @@ public class CrossOriginFilterTest
"Upgrade: WebSocket\r\n" +
"Origin: http://localhost\r\n" +
"\r\n";
String rawResponse = tester.getResponses(request);
String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -581,10 +588,10 @@ public class CrossOriginFilterTest
{
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
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);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
String request =
"GET / HTTP/1.1\r\n" +
@ -592,7 +599,7 @@ public class CrossOriginFilterTest
"Connection: close\r\n" +
"Origin: http://localhost\r\n" +
"\r\n";
String rawResponse = tester.getResponses(request);
String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
@ -607,10 +614,10 @@ public class CrossOriginFilterTest
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "PUT");
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);
tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
context.addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
// Preflight request
String request =
@ -620,7 +627,7 @@ public class CrossOriginFilterTest
CrossOriginFilter.ACCESS_CONTROL_REQUEST_METHOD_HEADER + ": PUT\r\n" +
"Origin: http://localhost\r\n" +
"\r\n";
String rawResponse = tester.getResponses(request);
String rawResponse = connector.getResponse(request);
HttpTester.Response response = HttpTester.parseResponse(rawResponse);
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.HttpStatus;
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.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.BeforeEach;
import org.junit.jupiter.api.Test;
@ -42,22 +45,25 @@ import static org.hamcrest.Matchers.is;
public class HeaderFilterTest
{
private ServletTester _tester;
private Server _server;
private LocalConnector _connector;
private ServletContextHandler _context;
@BeforeEach
public void setUp() throws Exception
{
_tester = new ServletTester();
_tester.setContextPath("/context");
_tester.addServlet(NullServlet.class, "/test/*");
_tester.start();
_server = new Server();
_connector = new LocalConnector(_server);
_server.addConnector(_connector);
_context = new ServletContextHandler(_server, "/context");
_context.addServlet(NullServlet.class, "/test/*");
_server.start();
}
@AfterEach
public void tearDown() throws Exception
public void tearDown()
{
_tester.stop();
LifeCycle.stop(_server);
}
@Test
@ -65,7 +71,7 @@ public class HeaderFilterTest
{
FilterHolder holder = new FilterHolder(HeaderFilter.class);
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();
request.setMethod("GET");
@ -73,7 +79,7 @@ public class HeaderFilterTest
request.setHeader("Host", "localhost");
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"));
}
@ -82,7 +88,7 @@ public class HeaderFilterTest
{
FilterHolder holder = new FilterHolder(HeaderFilter.class);
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();
request.setMethod("GET");
@ -90,7 +96,7 @@ public class HeaderFilterTest
request.setHeader("Host", "localhost");
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"));
}
@ -99,7 +105,7 @@ public class HeaderFilterTest
{
FilterHolder holder = new FilterHolder(HeaderFilter.class);
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();
request.setMethod("GET");
@ -107,7 +113,7 @@ public class HeaderFilterTest
request.setHeader("Host", "localhost");
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())));
}
@ -116,7 +122,7 @@ public class HeaderFilterTest
{
FilterHolder holder = new FilterHolder(HeaderFilter.class);
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();
request.setMethod("GET");
@ -124,7 +130,7 @@ public class HeaderFilterTest
request.setHeader("Host", "localhost");
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())));
}

View File

@ -31,8 +31,11 @@ import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.http.HttpStatus;
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.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.BeforeEach;
import org.junit.jupiter.api.Test;
@ -43,22 +46,25 @@ import static org.hamcrest.Matchers.not;
public class IncludeExcludeBasedFilterTest
{
private ServletTester _tester;
private Server _server;
private LocalConnector _connector;
private ServletContextHandler _context;
@BeforeEach
public void setUp() throws Exception
{
_tester = new ServletTester();
_tester.setContextPath("/context");
_tester.addServlet(NullServlet.class, "/test/*");
_tester.start();
_server = new Server();
_connector = new LocalConnector(_server);
_server.addConnector(_connector);
_context = new ServletContextHandler(_server, "/context");
_context.addServlet(NullServlet.class, "/test/*");
_server.start();
}
@AfterEach
public void tearDown() throws Exception
public void tearDown()
{
_tester.stop();
LifeCycle.stop(_server);
}
@Test
@ -66,7 +72,7 @@ public class IncludeExcludeBasedFilterTest
{
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
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();
request.setMethod("GET");
@ -74,7 +80,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost");
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"));
}
@ -83,7 +89,7 @@ public class IncludeExcludeBasedFilterTest
{
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
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();
request.setMethod("GET");
@ -91,7 +97,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost");
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")));
}
@ -100,7 +106,7 @@ public class IncludeExcludeBasedFilterTest
{
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
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();
request.setMethod("GET");
@ -108,7 +114,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost");
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")));
}
@ -117,7 +123,7 @@ public class IncludeExcludeBasedFilterTest
{
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
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();
request.setMethod("GET");
@ -125,7 +131,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost");
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"));
}
@ -135,7 +141,7 @@ public class IncludeExcludeBasedFilterTest
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
holder.setInitParameter("includedPaths", "^/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();
request.setMethod("GET");
@ -143,7 +149,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost");
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")));
}
@ -152,7 +158,7 @@ public class IncludeExcludeBasedFilterTest
{
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
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();
request.setMethod("GET");
@ -160,7 +166,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost");
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"));
}
@ -169,7 +175,7 @@ public class IncludeExcludeBasedFilterTest
{
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
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();
request.setMethod("GET");
@ -177,7 +183,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost");
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")));
}
@ -186,7 +192,7 @@ public class IncludeExcludeBasedFilterTest
{
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
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();
request.setMethod("GET");
@ -194,7 +200,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost");
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")));
}
@ -203,7 +209,7 @@ public class IncludeExcludeBasedFilterTest
{
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
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();
request.setMethod("GET");
@ -211,7 +217,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost");
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"));
}
@ -220,7 +226,7 @@ public class IncludeExcludeBasedFilterTest
{
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
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();
request.setMethod("GET");
@ -228,7 +234,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost");
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"));
}
@ -237,7 +243,7 @@ public class IncludeExcludeBasedFilterTest
{
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
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();
request.setMethod("GET");
@ -245,7 +251,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost");
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"));
}
@ -254,7 +260,7 @@ public class IncludeExcludeBasedFilterTest
{
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
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();
request.setMethod("GET");
@ -262,7 +268,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost");
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")));
}
@ -271,7 +277,7 @@ public class IncludeExcludeBasedFilterTest
{
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
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();
request.setMethod("GET");
@ -279,7 +285,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost");
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")));
}
@ -288,7 +294,7 @@ public class IncludeExcludeBasedFilterTest
{
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
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();
request.setMethod("GET");
@ -296,7 +302,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost");
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")));
}
@ -305,7 +311,7 @@ public class IncludeExcludeBasedFilterTest
{
FilterHolder holder = new FilterHolder(MockIncludeExcludeFilter.class);
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();
request.setMethod("GET");
@ -313,7 +319,7 @@ public class IncludeExcludeBasedFilterTest
request.setHeader("Host", "localhost");
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"));
}

View File

@ -32,13 +32,18 @@ import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse;
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.ServletTester;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDir;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.IO;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.component.LifeCycle;
import org.eclipse.jetty.util.resource.PathResource;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
@ -58,29 +63,33 @@ public class PutFilterTest
{
public WorkDir workDir;
private Path root;
private ServletTester tester;
private Server server;
private LocalConnector connector;
@BeforeEach
public void setUp() throws Exception
{
root = workDir.getEmptyPathDir();
tester = new ServletTester("/context");
tester.setBaseResource(new PathResource(root));
tester.addServlet(org.eclipse.jetty.servlet.DefaultServlet.class, "/");
FilterHolder holder = tester.addFilter(PutFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
server = new Server();
connector = new LocalConnector(server);
server.addConnector(connector);
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");
tester.setAttribute(ServletContext.TEMPDIR, workDir.getPath().toFile());
// Bloody Windows does not allow file renaming
context.setAttribute(ServletContext.TEMPDIR, workDir.getPath().toFile());
// Bloody Windows does not allow file renaming.
if (!System.getProperty("os.name").toLowerCase(Locale.ENGLISH).contains("windows"))
holder.setInitParameter("putAtomic", "true");
tester.start();
server.start();
}
@AfterEach
public void tearDown() throws Exception
public void tearDown()
{
tester.stop();
LifeCycle.stop(server);
}
@Test
@ -95,7 +104,7 @@ public class PutFilterTest
request.setVersion("HTTP/1.0");
request.setHeader("Host", "tester");
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());
// test PUT0
@ -104,7 +113,7 @@ public class PutFilterTest
request.setHeader("Content-Type", "text/plain");
String data0 = "Now is the time for all good men to come to the aid of the party";
request.setContent(data0);
response = HttpTester.parseResponse(tester.getResponses(request.generate()));
response = HttpTester.parseResponse(connector.getResponse(request.generate()));
assertEquals(HttpServletResponse.SC_CREATED, response.getStatus());
Path file = root.resolve("file.txt");
@ -116,7 +125,7 @@ public class PutFilterTest
request.setVersion("HTTP/1.0");
request.setHeader("Host", "tester");
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(data0, response.getContent());
@ -126,7 +135,7 @@ public class PutFilterTest
request.setHeader("Content-Type", "text/plain");
String data1 = "How Now BROWN COW!!!!";
request.setContent(data1);
response = HttpTester.parseResponse(tester.getResponses(request.generate()));
response = HttpTester.parseResponse(connector.getResponse(request.generate()));
assertEquals(HttpServletResponse.SC_OK, response.getStatus());
file = root.resolve("file.txt");
@ -140,7 +149,11 @@ public class PutFilterTest
String data2 = "Blah blah blah Blah blah";
request.setContent(data2);
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());
OutputStream out = socket.getOutputStream();
int l = toSend.length();
@ -161,22 +174,25 @@ public class PutFilterTest
request.setVersion("HTTP/1.0");
request.setHeader("Host", "tester");
request.setURI("/context/file.txt");
response = HttpTester.parseResponse(tester.getResponses(request.generate()));
response = HttpTester.parseResponse(connector.getResponse(request.generate()));
}
while (response.getStatus() == 200);
assertEquals(HttpServletResponse.SC_NOT_FOUND, response.getStatus());
out.write(toSend.substring(l - 5).getBytes());
out.flush();
String in = IO.toString(socket.getInputStream());
IO.copy(socket.getInputStream(), IO.getNullStream());
request.setMethod("GET");
request.setVersion("HTTP/1.0");
request.setHeader("Host", "tester");
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(data2, response.getContent());
serverConnector.stop();
server.removeConnector(serverConnector);
}
@Test
@ -194,7 +210,7 @@ public class PutFilterTest
request.setHeader("Content-Type", "text/plain");
String data1 = "How Now BROWN COW!!!!";
request.setContent(data1);
response = HttpTester.parseResponse(tester.getResponses(request.generate()));
response = HttpTester.parseResponse(connector.getResponse(request.generate()));
assertEquals(HttpServletResponse.SC_CREATED, response.getStatus());
Path file = root.resolve("file.txt");
@ -203,14 +219,14 @@ public class PutFilterTest
request.setMethod("DELETE");
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());
assertFalse(Files.exists(file));
request.setMethod("DELETE");
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());
}
@ -229,7 +245,7 @@ public class PutFilterTest
request.setHeader("Content-Type", "text/plain");
String data1 = "How Now BROWN COW!!!!";
request.setContent(data1);
response = HttpTester.parseResponse(tester.getResponses(request.generate()));
response = HttpTester.parseResponse(connector.getResponse(request.generate()));
assertEquals(HttpServletResponse.SC_CREATED, response.getStatus());
@ -240,7 +256,7 @@ public class PutFilterTest
request.setMethod("MOVE");
request.setURI("/context/file.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());
assertFalse(Files.exists(file));
@ -261,12 +277,11 @@ public class PutFilterTest
request.setVersion("HTTP/1.0");
request.put("Host", "tester");
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());
Set<String> options = new HashSet<String>();
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("POST", 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.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.ServletTester;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.component.LifeCycle;
import org.hamcrest.Matchers;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
@ -56,8 +59,9 @@ public class QoSFilterTest
{
private static final Logger LOG = LoggerFactory.getLogger(QoSFilterTest.class);
private ServletTester _tester;
private Server server;
private LocalConnector[] _connectors;
private ServletContextHandler context;
private final int numConnections = 8;
private final int numLoops = 6;
private final int maxQos = 4;
@ -65,25 +69,26 @@ public class QoSFilterTest
@BeforeEach
public void setUp() throws Exception
{
_tester = new ServletTester();
_tester.setContextPath("/context");
_tester.addServlet(TestServlet.class, "/test");
server = new Server();
context = new ServletContextHandler(server, "/context");
context.addServlet(TestServlet.class, "/test");
TestServlet.__maxSleepers = 0;
TestServlet.__sleepers = 0;
_connectors = new LocalConnector[numConnections];
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
public void tearDown() throws Exception
public void tearDown()
{
_tester.stop();
LifeCycle.stop(server);
}
@Test
@ -113,7 +118,7 @@ public class QoSFilterTest
FilterHolder holder = new FilterHolder(QoSFilter2.class);
holder.setAsyncSupported(true);
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<>();
for (int i = 0; i < numConnections; ++i)
@ -138,7 +143,7 @@ public class QoSFilterTest
FilterHolder holder = new FilterHolder(QoSFilter2.class);
holder.setAsyncSupported(true);
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<>();
for (int i = 0; i < numConnections; ++i)
@ -167,7 +172,7 @@ public class QoSFilterTest
class Worker implements Callable<Void>
{
private int _num;
private final 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;
}
@ -208,9 +213,14 @@ public class QoSFilterTest
public Void call() throws Exception
{
URL url = null;
ServerConnector connector = null;
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++)
{
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);
}
finally
{
if (connector != null)
{
connector.stop();
server.removeConnector(connector);
}
}
return null;
}
}

View File

@ -1,6 +1,5 @@
# Jetty Logging using jetty-slf4j-impl
#org.eclipse.jetty.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.DoSFilter.LEVEL=DEBUG