Merge branch 'jetty-9.2.x' into pr/23

This commit is contained in:
Greg Wilkins 2014-11-07 12:01:06 +11:00
commit 186aac6788
9 changed files with 266 additions and 35 deletions

View File

@ -252,6 +252,12 @@ public abstract class AbstractWebAppProvider extends AbstractLifeCycle implement
(overrideBundleInstallLocation == null
? BundleFileLocatorHelperFactory.getFactory().getHelper().getBundleInstallLocation(_bundle)
: new File(overrideBundleInstallLocation));
if (LOG.isDebugEnabled())
{
LOG.debug("Bundle location is {}, install location: {}", _bundle.getLocation(), bundleInstallLocation);
}
URL url = null;
Resource rootResource = Resource.newResource(BundleFileLocatorHelperFactory.getFactory().getHelper().getLocalURL(bundleInstallLocation.toURI().toURL()));
//try and make sure the rootResource is useable - if its a jar then make it a jar file url
@ -266,6 +272,8 @@ public abstract class AbstractWebAppProvider extends AbstractLifeCycle implement
if (_webAppPath == null || _webAppPath.length() == 0 || ".".equals(_webAppPath))
{
url = bundleInstallLocation.toURI().toURL();
if (LOG.isDebugEnabled())
LOG.debug("Webapp base using bundle install location: {}", url);
}
else
{
@ -273,16 +281,24 @@ public abstract class AbstractWebAppProvider extends AbstractLifeCycle implement
if (_webAppPath.startsWith("/") || _webAppPath.startsWith("file:"))
{
url = new File(_webAppPath).toURI().toURL();
if (LOG.isDebugEnabled())
LOG.debug("Webapp base using absolute location: {}", url);
}
else if (bundleInstallLocation != null && bundleInstallLocation.isDirectory())
{
url = new File(bundleInstallLocation, _webAppPath).toURI().toURL();
if (LOG.isDebugEnabled())
LOG.debug("Webapp base using path relative to bundle unpacked install location: {}", url);
}
else if (bundleInstallLocation != null)
{
Enumeration<URL> urls = BundleFileLocatorHelperFactory.getFactory().getHelper().findEntries(_bundle, _webAppPath);
if (urls != null && urls.hasMoreElements())
{
url = urls.nextElement();
if (LOG.isDebugEnabled())
LOG.debug("Webapp base using path relative to packed bundle location: {}", url);
}
}
}

View File

@ -105,6 +105,7 @@ public class OSGiWebInfConfiguration extends WebInfConfiguration
for (Bundle bundle : bundles)
{
LOG.debug("Checking bundle {}:{}", bundle.getBundleId(), bundle.getSymbolicName());
if (pattern != null)
{
// if bundle symbolic name matches the pattern

View File

@ -42,7 +42,7 @@ public class SelectChannelTimeoutTest extends ConnectorTimeoutTest
startServer(connector);
}
@Test
@Test(timeout=60000)
public void testIdleTimeoutAfterSuspend() throws Exception
{
SuspendHandler _handler = new SuspendHandler();
@ -57,7 +57,7 @@ public class SelectChannelTimeoutTest extends ConnectorTimeoutTest
assertTrue(process(null).toUpperCase(Locale.ENGLISH).contains("RESUMED"));
}
@Test
@Test(timeout=60000)
public void testIdleTimeoutAfterTimeout() throws Exception
{
SuspendHandler _handler = new SuspendHandler();
@ -71,7 +71,7 @@ public class SelectChannelTimeoutTest extends ConnectorTimeoutTest
assertTrue(process(null).toUpperCase(Locale.ENGLISH).contains("TIMEOUT"));
}
@Test
@Test(timeout=60000)
public void testIdleTimeoutAfterComplete() throws Exception
{
SuspendHandler _handler = new SuspendHandler();

View File

@ -29,6 +29,8 @@ import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.http.HttpTester;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlets.gzip.AsyncScheduledWrite;
import org.eclipse.jetty.servlets.gzip.AsyncTimeoutWrite;
import org.eclipse.jetty.servlets.gzip.GzipTester;
import org.eclipse.jetty.servlets.gzip.TestServletBufferTypeLengthWrite;
import org.eclipse.jetty.servlets.gzip.TestServletLengthStreamTypeWrite;
@ -38,13 +40,13 @@ import org.eclipse.jetty.servlets.gzip.TestServletStreamLengthTypeWriteWithFlush
import org.eclipse.jetty.servlets.gzip.TestServletStreamTypeLengthWrite;
import org.eclipse.jetty.servlets.gzip.TestServletTypeLengthStreamWrite;
import org.eclipse.jetty.servlets.gzip.TestServletTypeStreamLengthWrite;
import org.eclipse.jetty.toolchain.test.TestTracker;
import org.eclipse.jetty.toolchain.test.TestingDir;
import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@ -57,20 +59,8 @@ import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class GzipFilterContentLengthTest
{
@Rule
public final TestWatcher testName = new TestWatcher()
{
@Override
public void starting(Description description)
{
super.starting(description);
System.err.printf("Running %s.%s()%n",
description.getClassName(),
description.getMethodName());
}
};
public final TestTracker tracker = new TestTracker();
/**
* These are the junit parameters for running this test.
@ -85,11 +75,13 @@ public class GzipFilterContentLengthTest
*
* @return the junit parameters
*/
@Parameters
@Parameters(name="{2}/{1} {0}")
public static List<Object[]> data()
{
return Arrays.asList(new Object[][]
{
{ AsyncGzipFilter.class, AsyncTimeoutWrite.class, GzipFilter.GZIP },
{ AsyncGzipFilter.class, AsyncScheduledWrite.class, GzipFilter.GZIP },
{ AsyncGzipFilter.class, TestServletLengthStreamTypeWrite.class, GzipFilter.GZIP },
{ AsyncGzipFilter.class, TestServletLengthTypeStreamWrite.class, GzipFilter.GZIP },
{ AsyncGzipFilter.class, TestServletStreamLengthTypeWrite.class, GzipFilter.GZIP },
@ -99,6 +91,8 @@ public class GzipFilterContentLengthTest
{ AsyncGzipFilter.class, TestServletTypeStreamLengthWrite.class, GzipFilter.GZIP },
{ AsyncGzipFilter.class, TestServletBufferTypeLengthWrite.class, GzipFilter.GZIP },
//{ GzipFilter.class, AsyncTimeoutWrite.class, GzipFilter.GZIP },
//{ GzipFilter.class, AsyncScheduledWrite.class, GzipFilter.GZIP },
{ GzipFilter.class, TestServletLengthStreamTypeWrite.class, GzipFilter.GZIP },
{ GzipFilter.class, TestServletLengthTypeStreamWrite.class, GzipFilter.GZIP },
{ GzipFilter.class, TestServletStreamLengthTypeWrite.class, GzipFilter.GZIP },
@ -107,6 +101,8 @@ public class GzipFilterContentLengthTest
{ GzipFilter.class, TestServletTypeLengthStreamWrite.class, GzipFilter.GZIP },
{ GzipFilter.class, TestServletTypeStreamLengthWrite.class, GzipFilter.GZIP },
//{ GzipFilter.class, AsyncTimeoutWrite.class, GzipFilter.DEFLATE },
//{ GzipFilter.class, AsyncScheduledWrite.class, GzipFilter.DEFLATE },
{ GzipFilter.class, TestServletLengthStreamTypeWrite.class, GzipFilter.DEFLATE },
{ GzipFilter.class, TestServletLengthTypeStreamWrite.class, GzipFilter.DEFLATE },
{ GzipFilter.class, TestServletStreamLengthTypeWrite.class, GzipFilter.DEFLATE },

View File

@ -68,6 +68,7 @@ public class GzipFilterDefaultTest
this.compressionType = compressionType;
}
@SuppressWarnings("serial")
public static class HttpStatusServlet extends HttpServlet
{
private int _status = 204;
@ -86,6 +87,7 @@ public class GzipFilterDefaultTest
}
@SuppressWarnings("serial")
public static class HttpErrorServlet extends HttpServlet
{
private int _status = 400;
@ -104,6 +106,7 @@ public class GzipFilterDefaultTest
}
@SuppressWarnings("serial")
public static class HttpContentTypeWithEncoding extends HttpServlet
{
public static final String COMPRESSED_CONTENT = "<html><head></head><body><h1>COMPRESSABLE CONTENT</h1>"+
@ -154,6 +157,7 @@ public class GzipFilterDefaultTest
}
}
@SuppressWarnings("serial")
public static class GetServlet extends DefaultServlet
{
public GetServlet()
@ -191,6 +195,7 @@ public class GzipFilterDefaultTest
try
{
tester.start();
@SuppressWarnings("unused")
HttpTester.Response http = tester.assertIsResponseNotGzipCompressed("GET","empty.txt",0,200);
}
finally
@ -278,6 +283,7 @@ public class GzipFilterDefaultTest
GzipTester tester = new GzipTester(testingdir, compressionType);
tester.setGzipFilterClass(testFilter);
tester.copyTestServerFile("test.svg");
@SuppressWarnings("unused")
FilterHolder holder = tester.setContentServlet(org.eclipse.jetty.servlet.DefaultServlet.class);
try
{
@ -632,6 +638,7 @@ public class GzipFilterDefaultTest
GzipTester tester = new GzipTester(testingdir,compressionType);
tester.setGzipFilterClass(testFilter);
@SuppressWarnings("unused")
FilterHolder holder = tester.setContentServlet(DefaultServlet.class);
tester.copyTestServerFile("test.svgz");
try

View File

@ -0,0 +1,89 @@
//
// ========================================================================
// Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.servlets.gzip;
import java.io.IOException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javax.servlet.AsyncContext;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class AsyncScheduledWrite extends TestDirContentServlet
{
private static class DispatchBack implements Runnable
{
private final AsyncContext ctx;
public DispatchBack(AsyncContext ctx)
{
this.ctx = ctx;
}
@Override
public void run()
{
ctx.dispatch();
}
}
private ScheduledExecutorService scheduler;
public void init(ServletConfig config) throws ServletException
{
super.init(config);
scheduler = Executors.newScheduledThreadPool(3);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
Boolean suspended = (Boolean)request.getAttribute("SUSPENDED");
if (suspended==null || !suspended)
{
request.setAttribute("SUSPENDED",Boolean.TRUE);
AsyncContext ctx = request.startAsync();
ctx.setTimeout(0);
scheduler.schedule(new DispatchBack(ctx),500,TimeUnit.MILLISECONDS);
}
else
{
String fileName = request.getServletPath();
byte[] dataBytes = loadContentFileBytes(fileName);
response.setContentLength(dataBytes.length);
ServletOutputStream out = response.getOutputStream();
if (fileName.endsWith("txt"))
response.setContentType("text/plain");
else if (fileName.endsWith("mp3"))
response.setContentType("audio/mpeg");
response.setHeader("ETag","W/etag-" + fileName);
out.write(dataBytes);
}
}
}

View File

@ -0,0 +1,89 @@
//
// ========================================================================
// Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.servlets.gzip;
import java.io.IOException;
import javax.servlet.AsyncContext;
import javax.servlet.AsyncEvent;
import javax.servlet.AsyncListener;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class AsyncTimeoutWrite extends TestDirContentServlet implements AsyncListener
{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
if (request.getAttribute("filename")!=null)
throw new IllegalStateException();
ServletOutputStream out = response.getOutputStream();
AsyncContext ctx = (AsyncContext)request.getAttribute(AsyncContext.class.getName());
ctx = request.startAsync();
String fileName = request.getServletPath();
request.setAttribute("filename",fileName);
ctx.addListener(this);
ctx.setTimeout(200);
}
@Override
public void onComplete(AsyncEvent event) throws IOException
{
}
@Override
public void onTimeout(AsyncEvent event) throws IOException
{
HttpServletRequest request = (HttpServletRequest)event.getSuppliedRequest();
HttpServletResponse response = (HttpServletResponse)event.getSuppliedResponse();
String fileName = (String)request.getAttribute("filename");
byte[] dataBytes = loadContentFileBytes(fileName);
response.setContentLength(dataBytes.length);
ServletOutputStream out = response.getOutputStream();
if (fileName.endsWith("txt"))
response.setContentType("text/plain");
else if (fileName.endsWith("mp3"))
response.setContentType("audio/mpeg");
response.setHeader("ETag","W/etag-" + fileName);
out.write(dataBytes);
event.getAsyncContext().complete();
}
@Override
public void onError(AsyncEvent event) throws IOException
{
}
@Override
public void onStartAsync(AsyncEvent event) throws IOException
{
}
}

View File

@ -59,11 +59,15 @@ import org.eclipse.jetty.servlets.GzipFilter;
import org.eclipse.jetty.toolchain.test.IO;
import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
import org.eclipse.jetty.toolchain.test.TestingDir;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.hamcrest.Matchers;
import org.junit.Assert;
public class GzipTester
{
private static final Logger LOG = Log.getLogger(GzipTester.class);
private Class<? extends Filter> gzipFilterClass = GzipFilter.class;
private String encoding = "ISO8859_1";
private String userAgent = null;
@ -165,7 +169,6 @@ public class GzipTester
public HttpTester.Response assertIsResponseGzipCompressed(String method, String requestedFilename, String serverFilename, long ifmodifiedsince) throws Exception
{
// System.err.printf("[GzipTester] requesting /context/%s%n",requestedFilename);
HttpTester.Request request = HttpTester.newRequest();
HttpTester.Response response;
@ -186,10 +189,10 @@ public class GzipTester
// Assert.assertThat("Response.status",response.getStatus(),is(HttpServletResponse.SC_OK));
// Response headers should have either a Transfer-Encoding indicating chunked OR a Content-Length
/* TODO need to check for the 3rd option of EOF content. To do this properly you might need to look at both HTTP/1.1 and HTTP/1.0 requests
String contentLength = response.get("Content-Length");
String transferEncoding = response.get("Transfer-Encoding");
/* TODO need to check for the 3rd option of EOF content. To do this properly you might need to look at both HTTP/1.1 and HTTP/1.0 requests
boolean chunked = (transferEncoding != null) && (transferEncoding.indexOf("chunk") >= 0);
if(!chunked) {
Assert.assertThat("Response.header[Content-Length]",contentLength,notNullValue());
@ -243,7 +246,7 @@ public class GzipTester
public HttpTester.Response assertIsResponseNotModified(String method, String requestedFilename, long ifmodifiedsince) throws Exception
{ // System.err.printf("[GzipTester] requesting /context/%s%n",requestedFilename);
{
HttpTester.Request request = HttpTester.newRequest();
HttpTester.Response response;
@ -304,7 +307,6 @@ public class GzipTester
*/
public void assertIsResponseNotGzipFiltered(String requestedFilename, String testResourceSha1Sum, String expectedContentType, String expectedContentEncoding) throws Exception
{
//System.err.printf("[GzipTester] requesting /context/%s%n",requestedFilename);
HttpTester.Request request = HttpTester.newRequest();
HttpTester.Response response;
@ -356,14 +358,13 @@ public class GzipTester
private void dumpHeaders(String prefix, HttpTester.Message message)
{
//System.out.println(prefix);
@SuppressWarnings("unchecked")
LOG.debug("dumpHeaders: {}", prefix);
Enumeration<String> names = message.getFieldNames();
while (names.hasMoreElements())
{
String name = names.nextElement();
String value = message.get(name);
//System.out.printf(" [%s] = %s%n",name,value);
LOG.debug("dumpHeaders: {} = {}",name,value);
}
}
@ -469,7 +470,6 @@ public class GzipTester
private HttpTester.Response executeRequest(String method, String uri) throws IOException, Exception
{
//System.err.printf("[GzipTester] requesting %s%n",uri);
HttpTester.Request request = HttpTester.newRequest();
HttpTester.Response response;
@ -611,7 +611,7 @@ public class GzipTester
ServletHolder servletHolder = tester.addServlet(servletClass,"/");
servletHolder.setInitParameter("baseDir",testdir.getDir().getAbsolutePath());
servletHolder.setInitParameter("etags","true");
FilterHolder holder = tester.addFilter(gzipFilterClass,"/*",EnumSet.allOf(DispatcherType.class));
FilterHolder holder = tester.addFilter(gzipFilterClass,"/*",EnumSet.of(DispatcherType.REQUEST));
holder.setInitParameter("vary","Accept-Encoding");
return holder;
}

View File

@ -17,6 +17,46 @@
<verbose>false</verbose>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<id>artifact-jar</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
<configuration>
<archive>
<manifestFile>target/classes/META-INF/MANIFEST.MF</manifestFile>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<executions>
<execution>
<id>bundle-manifest</id>
<phase>process-classes</phase>
<goals>
<goal>manifest</goal>
</goals>
</execution>
</executions>
<configuration>
<instructions>
<Bundle-SymbolicName>org.eclipse.jetty.tests.test-web-fragment;singleton:=true</Bundle-SymbolicName>
<Bundle-Description>A bundle containing web fragment for testing</Bundle-Description>
<Export-Package>com.acme.fragment;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"</Export-Package>
<_nouses>true</_nouses>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
@ -24,12 +64,5 @@
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<!--
<dependency>
<groupId>org.eclipse.jetty.orbit</groupId>
<artifactId>javax.servlet</artifactId>
</dependency>
-->
</dependencies>
</project>