From da8f5052a362c5a244de510d2977d735607975a7 Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Thu, 11 Aug 2011 13:20:31 -0700 Subject: [PATCH] Beefing up GzipFilter tests --- .../servlets/GzipFilterContentLengthTest.java | 146 +++++++ .../GzipFilterDefaultNoRecompressTest.java | 101 +++++ .../jetty/servlets/GzipFilterDefaultTest.java | 87 +++++ .../jetty/servlets/GzipFilterTest.java | 171 -------- .../jetty/servlets/GzipFilterTest1.java | 56 --- .../jetty/servlets/GzipFilterTest2.java | 54 --- .../jetty/servlets/GzipFilterTest3.java | 56 --- .../jetty/servlets/GzipFilterTest4.java | 54 --- .../jetty/servlets/gzip/GzipTester.java | 369 ++++++++++++++++++ .../org/eclipse/jetty/servlets/gzip/Hex.java | 58 +++ .../jetty/servlets/gzip/NoOpOutputStream.java | 40 ++ .../servlets/gzip/TestDirContentServlet.java | 56 +++ .../TestServletLengthTypeStreamWrite.java | 46 +++ .../TestServletStreamLengthTypeWrite.java | 47 +++ .../TestServletStreamTypeLengthWrite.java | 47 +++ .../TestServletTypeLengthStreamWrite.java | 46 +++ .../src/test/resources/jetty_logo.bmp | Bin 0 -> 90682 bytes .../src/test/resources/jetty_logo.bmp.sha1 | 1 + .../src/test/resources/jetty_logo.gif | Bin 0 -> 3443 bytes .../src/test/resources/jetty_logo.gif.sha1 | 1 + .../src/test/resources/jetty_logo.jp2 | Bin 0 -> 19897 bytes .../src/test/resources/jetty_logo.jp2.sha1 | 1 + .../src/test/resources/jetty_logo.jpeg | Bin 0 -> 6722 bytes .../src/test/resources/jetty_logo.jpeg.sha1 | 1 + .../src/test/resources/jetty_logo.jpg | Bin 0 -> 6722 bytes .../src/test/resources/jetty_logo.jpg.sha1 | 1 + .../src/test/resources/jetty_logo.png | Bin 0 -> 13002 bytes .../src/test/resources/jetty_logo.png.sha1 | 1 + .../src/test/resources/jetty_logo.tga | Bin 0 -> 90578 bytes .../src/test/resources/jetty_logo.tga.sha1 | 1 + .../src/test/resources/jetty_logo.tif | Bin 0 -> 13284 bytes .../src/test/resources/jetty_logo.tif.sha1 | 1 + .../src/test/resources/jetty_logo.tiff | Bin 0 -> 13284 bytes .../src/test/resources/jetty_logo.tiff.sha1 | 1 + .../src/test/resources/jetty_logo.xcf | Bin 0 -> 11447 bytes .../src/test/resources/jetty_logo.xcf.sha1 | 1 + .../src/test/resources/test_quotes.bz2 | Bin 0 -> 594 bytes .../src/test/resources/test_quotes.bz2.sha1 | 1 + .../src/test/resources/test_quotes.gz | Bin 0 -> 577 bytes .../src/test/resources/test_quotes.gz.sha1 | 1 + .../src/test/resources/test_quotes.rar | Bin 0 -> 679 bytes .../src/test/resources/test_quotes.rar.sha1 | 1 + .../src/test/resources/test_quotes.txt | 19 + .../src/test/resources/test_quotes.txt.sha1 | 1 + .../src/test/resources/test_quotes.zip | Bin 0 -> 739 bytes .../src/test/resources/test_quotes.zip.sha1 | 1 + .../eclipse/jetty/testing/ServletTester.java | 6 + 47 files changed, 1083 insertions(+), 391 deletions(-) create mode 100644 jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterContentLengthTest.java create mode 100644 jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterDefaultNoRecompressTest.java create mode 100644 jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterDefaultTest.java delete mode 100644 jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterTest.java delete mode 100644 jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterTest1.java delete mode 100644 jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterTest2.java delete mode 100644 jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterTest3.java delete mode 100644 jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterTest4.java create mode 100644 jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/GzipTester.java create mode 100644 jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/Hex.java create mode 100644 jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/NoOpOutputStream.java create mode 100644 jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestDirContentServlet.java create mode 100644 jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletLengthTypeStreamWrite.java create mode 100644 jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletStreamLengthTypeWrite.java create mode 100644 jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletStreamTypeLengthWrite.java create mode 100644 jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletTypeLengthStreamWrite.java create mode 100644 jetty-servlets/src/test/resources/jetty_logo.bmp create mode 100644 jetty-servlets/src/test/resources/jetty_logo.bmp.sha1 create mode 100644 jetty-servlets/src/test/resources/jetty_logo.gif create mode 100644 jetty-servlets/src/test/resources/jetty_logo.gif.sha1 create mode 100644 jetty-servlets/src/test/resources/jetty_logo.jp2 create mode 100644 jetty-servlets/src/test/resources/jetty_logo.jp2.sha1 create mode 100644 jetty-servlets/src/test/resources/jetty_logo.jpeg create mode 100644 jetty-servlets/src/test/resources/jetty_logo.jpeg.sha1 create mode 100644 jetty-servlets/src/test/resources/jetty_logo.jpg create mode 100644 jetty-servlets/src/test/resources/jetty_logo.jpg.sha1 create mode 100644 jetty-servlets/src/test/resources/jetty_logo.png create mode 100644 jetty-servlets/src/test/resources/jetty_logo.png.sha1 create mode 100644 jetty-servlets/src/test/resources/jetty_logo.tga create mode 100644 jetty-servlets/src/test/resources/jetty_logo.tga.sha1 create mode 100644 jetty-servlets/src/test/resources/jetty_logo.tif create mode 100644 jetty-servlets/src/test/resources/jetty_logo.tif.sha1 create mode 100644 jetty-servlets/src/test/resources/jetty_logo.tiff create mode 100644 jetty-servlets/src/test/resources/jetty_logo.tiff.sha1 create mode 100644 jetty-servlets/src/test/resources/jetty_logo.xcf create mode 100644 jetty-servlets/src/test/resources/jetty_logo.xcf.sha1 create mode 100644 jetty-servlets/src/test/resources/test_quotes.bz2 create mode 100644 jetty-servlets/src/test/resources/test_quotes.bz2.sha1 create mode 100644 jetty-servlets/src/test/resources/test_quotes.gz create mode 100644 jetty-servlets/src/test/resources/test_quotes.gz.sha1 create mode 100644 jetty-servlets/src/test/resources/test_quotes.rar create mode 100644 jetty-servlets/src/test/resources/test_quotes.rar.sha1 create mode 100644 jetty-servlets/src/test/resources/test_quotes.txt create mode 100644 jetty-servlets/src/test/resources/test_quotes.txt.sha1 create mode 100644 jetty-servlets/src/test/resources/test_quotes.zip create mode 100644 jetty-servlets/src/test/resources/test_quotes.zip.sha1 diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterContentLengthTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterContentLengthTest.java new file mode 100644 index 00000000000..f0498fbb18d --- /dev/null +++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterContentLengthTest.java @@ -0,0 +1,146 @@ +package org.eclipse.jetty.servlets; + +import java.util.Arrays; +import java.util.List; + +import javax.servlet.Servlet; + +import org.eclipse.jetty.http.gzip.GzipResponseWrapper; +import org.eclipse.jetty.servlet.FilterHolder; +import org.eclipse.jetty.servlets.gzip.GzipTester; +import org.eclipse.jetty.servlets.gzip.TestServletLengthTypeStreamWrite; +import org.eclipse.jetty.servlets.gzip.TestServletStreamLengthTypeWrite; +import org.eclipse.jetty.servlets.gzip.TestServletStreamTypeLengthWrite; +import org.eclipse.jetty.servlets.gzip.TestServletTypeLengthStreamWrite; +import org.eclipse.jetty.toolchain.test.TestingDir; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +/** + * Test the GzipFilter support for Content-Length setting variations. + * + * @see http://bugs.eclipse.org/354014 + */ +@RunWith(Parameterized.class) +public class GzipFilterContentLengthTest +{ + /** + * These are the junit parameters for running this test. + *

+ * We have 4 test servlets, that arrange the content-length/content-type/get stream in different orders so as to + * simulate the real world scenario that caused the bug in http://bugs.eclipse.org/354014 + *

+ * This test case will be run with each entry in the array below as setup parameters for the test case. + * + * @return the junit parameters + */ + @Parameters + public static List data() + { + return Arrays.asList(new Object[][] + { + { TestServletLengthTypeStreamWrite.class }, + { TestServletStreamLengthTypeWrite.class }, + { TestServletStreamTypeLengthWrite.class }, + { TestServletTypeLengthStreamWrite.class } }); + } + + private static final int LARGE = GzipResponseWrapper.DEFAULT_BUFFER_SIZE * 8; + private static final int MEDIUM = GzipResponseWrapper.DEFAULT_BUFFER_SIZE; + private static final int SMALL = GzipResponseWrapper.DEFAULT_BUFFER_SIZE / 4; + + @Rule + public TestingDir testingdir = new TestingDir(); + + private Class testServlet; + + public GzipFilterContentLengthTest(Class testServlet) + { + this.testServlet = testServlet; + } + + private void assertIsGzipCompressed(Class servletClass, int filesize) throws Exception + { + GzipTester tester = new GzipTester(testingdir); + + // Test content that is smaller than the buffer. + tester.prepareServerFile("file.txt",filesize); + + FilterHolder holder = tester.setContentServlet(servletClass); + holder.setInitParameter("mimeTypes","text/plain"); + + try + { + tester.start(); + tester.assertIsResponseGzipCompressed("file.txt"); + } + finally + { + tester.stop(); + } + } + + private void assertIsNotGzipCompressed(Class servletClass, int filesize) throws Exception + { + GzipTester tester = new GzipTester(testingdir); + + // Test content that is smaller than the buffer. + tester.prepareServerFile("file.mp3",filesize); + + FilterHolder holder = tester.setContentServlet(org.eclipse.jetty.servlet.DefaultServlet.class); + holder.setInitParameter("mimeTypes","text/plain"); + + try + { + tester.start(); + tester.assertIsResponseNotGzipCompressed("file.mp3",filesize); + } + finally + { + tester.stop(); + } + } + + @Test + public void testIsGzipCompressedTiny() throws Exception + { + assertIsGzipCompressed(testServlet,SMALL); + } + + /** + * Tests for Length>Type>Stream>Write problems encountered in GzipFilter + * + * @see http://bugs.eclipse.org/354014 + */ + @Test + public void testIsGzipCompressedMedium() throws Exception + { + assertIsGzipCompressed(testServlet,MEDIUM); + } + + /** + * Tests for Length>Type>Stream>Write problems encountered in GzipFilter + * + * @see http://bugs.eclipse.org/354014 + */ + @Test + public void testIsGzipCompressedLarge() throws Exception + { + assertIsGzipCompressed(testServlet,LARGE); + } + + /** + * Tests for Length>Type>Stream>Write problems encountered in GzipFilter + * + * @see http://bugs.eclipse.org/354014 + */ + @Test + public void testIsNotGzipCompressed() throws Exception + { + assertIsNotGzipCompressed(TestServletLengthTypeStreamWrite.class,LARGE); + } +} diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterDefaultNoRecompressTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterDefaultNoRecompressTest.java new file mode 100644 index 00000000000..88139bcfffe --- /dev/null +++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterDefaultNoRecompressTest.java @@ -0,0 +1,101 @@ +package org.eclipse.jetty.servlets; + +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +import org.eclipse.jetty.servlet.DefaultServlet; +import org.eclipse.jetty.servlet.FilterHolder; +import org.eclipse.jetty.servlets.gzip.GzipTester; +import org.eclipse.jetty.toolchain.test.IO; +import org.eclipse.jetty.toolchain.test.MavenTestingUtils; +import org.eclipse.jetty.toolchain.test.TestingDir; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +/** + * Tests {@link GzipFilter} in combination with {@link DefaultServlet} for + * ability to configure {@link GzipFilter} to ignore recompress situations + * from upstream. + */ +@RunWith(Parameterized.class) +public class GzipFilterDefaultNoRecompressTest +{ + @Parameters + public static List data() + { + return Arrays.asList(new Object[][] + { + // Some already compressed files + { "test_quotes.gz" }, + { "test_quotes.bz2" }, + { "test_quotes.zip" }, + { "test_quotes.rar" }, + // Some images (common first) + { "jetty_logo.png" }, + { "jetty_logo.gif" }, + { "jetty_logo.jpeg" }, + { "jetty_logo.jpg" }, + // Lesser encountered images (usually found being requested from non-browser clients) + { "jetty_logo.bmp" }, + { "jetty_logo.tga" }, + { "jetty_logo.tif" }, + { "jetty_logo.tiff" }, + { "jetty_logo.xcf" }, + { "jetty_logo.jp2" } }); + } + + @Rule + public TestingDir testingdir = new TestingDir(); + + private String alreadyCompressedFilename; + + public GzipFilterDefaultNoRecompressTest(String testFilename) { + this.alreadyCompressedFilename = testFilename; + } + + @Test + @Ignore("Cannot find a configuration that would allow this to pass") + public void testNotGzipFiltered_Default_AlreadyCompressed() throws Exception + { + GzipTester tester = new GzipTester(testingdir); + + copyTestFileToServer(alreadyCompressedFilename); + + // Using DefaultServlet, with default GzipFilter setup + FilterHolder holder = tester.setContentServlet(DefaultServlet.class); + // TODO: find a configuration of the GzipFilter to allow + // each of these test cases to pass. + + StringBuilder mimeTypes = new StringBuilder(); + mimeTypes.append("images/png"); + mimeTypes.append(",images/jpeg"); + mimeTypes.append(",images/gif"); + mimeTypes.append(",images/jp2"); + + holder.setInitParameter("mimeTypes", mimeTypes.toString()); + + try + { + tester.start(); + tester.assertIsResponseNotGzipFiltered(alreadyCompressedFilename, + alreadyCompressedFilename + ".sha1"); + } + finally + { + tester.stop(); + } + } + + private void copyTestFileToServer(String testFilename) throws IOException + { + File testFile = MavenTestingUtils.getTestResourceFile(testFilename); + File outFile = testingdir.getFile(testFilename); + IO.copy(testFile,outFile); + } +} diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterDefaultTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterDefaultTest.java new file mode 100644 index 00000000000..e597c139b1c --- /dev/null +++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterDefaultTest.java @@ -0,0 +1,87 @@ +package org.eclipse.jetty.servlets; + +import org.eclipse.jetty.http.gzip.GzipResponseWrapper; +import org.eclipse.jetty.servlet.DefaultServlet; +import org.eclipse.jetty.servlet.FilterHolder; +import org.eclipse.jetty.servlets.gzip.GzipTester; +import org.eclipse.jetty.toolchain.test.TestingDir; +import org.junit.Rule; +import org.junit.Test; + +/** + * Test the GzipFilter support built into the {@link DefaultServlet} + */ +public class GzipFilterDefaultTest +{ + @Rule + public TestingDir testingdir = new TestingDir(); + + @Test + public void testIsGzipCompressedTiny() throws Exception + { + GzipTester tester = new GzipTester(testingdir); + + // Test content that is smaller than the buffer. + int filesize = GzipResponseWrapper.DEFAULT_BUFFER_SIZE / 4; + tester.prepareServerFile("file.txt",filesize); + + FilterHolder holder = tester.setContentServlet(org.eclipse.jetty.servlet.DefaultServlet.class); + holder.setInitParameter("mimeTypes","text/plain"); + + try + { + tester.start(); + tester.assertIsResponseGzipCompressed("file.txt"); + } + finally + { + tester.stop(); + } + } + + @Test + public void testIsGzipCompressedLarge() throws Exception + { + GzipTester tester = new GzipTester(testingdir); + + // Test content that is smaller than the buffer. + int filesize = GzipResponseWrapper.DEFAULT_BUFFER_SIZE * 4; + tester.prepareServerFile("file.txt",filesize); + + FilterHolder holder = tester.setContentServlet(org.eclipse.jetty.servlet.DefaultServlet.class); + holder.setInitParameter("mimeTypes","text/plain"); + + try + { + tester.start(); + tester.assertIsResponseGzipCompressed("file.txt"); + } + finally + { + tester.stop(); + } + } + + @Test + public void testIsNotGzipCompressed() throws Exception + { + GzipTester tester = new GzipTester(testingdir); + + // Test content that is smaller than the buffer. + int filesize = GzipResponseWrapper.DEFAULT_BUFFER_SIZE * 4; + tester.prepareServerFile("file.mp3",filesize); + + FilterHolder holder = tester.setContentServlet(org.eclipse.jetty.servlet.DefaultServlet.class); + holder.setInitParameter("mimeTypes","text/plain"); + + try + { + tester.start(); + tester.assertIsResponseNotGzipCompressed("file.mp3", filesize); + } + finally + { + tester.stop(); + } + } +} diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterTest.java deleted file mode 100644 index feb70a449ed..00000000000 --- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterTest.java +++ /dev/null @@ -1,171 +0,0 @@ -// ======================================================================== -// Copyright (c) 2004-2009 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; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.io.BufferedOutputStream; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.util.zip.GZIPInputStream; - -import javax.servlet.http.HttpServletResponse; - -import org.eclipse.jetty.http.gzip.GzipResponseWrapper; -import org.eclipse.jetty.io.ByteArrayBuffer; -import org.eclipse.jetty.servlet.FilterHolder; -import org.eclipse.jetty.testing.HttpTester; -import org.eclipse.jetty.testing.ServletTester; -import org.eclipse.jetty.toolchain.test.TestingDir; -import org.eclipse.jetty.util.IO; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; - -public class GzipFilterTest -{ - public static String __content; - - static - { - // The size of content must be greater then - // buffer size in GzipResponseWrapper class. - StringBuilder builder = new StringBuilder(); - do - { - builder.append("Lorem ipsum dolor sit amet, consectetur adipiscing elit. In quis felis nunc. "); - builder.append("Quisque suscipit mauris et ante auctor ornare rhoncus lacus aliquet. Pellentesque "); - builder.append("habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. "); - builder.append("Vestibulum sit amet felis augue, vel convallis dolor. Cras accumsan vehicula diam "); - builder.append("at faucibus. Etiam in urna turpis, sed congue mi. Morbi et lorem eros. Donec vulputate "); - builder.append("velit in risus suscipit lobortis. Aliquam id urna orci, nec sollicitudin ipsum. "); - builder.append("Cras a orci turpis. Donec suscipit vulputate cursus. Mauris nunc tellus, fermentum "); - builder.append("eu auctor ut, mollis at diam. Quisque porttitor ultrices metus, vitae tincidunt massa "); - builder.append("sollicitudin a. Vivamus porttitor libero eget purus hendrerit cursus. Integer aliquam "); - builder.append("consequat mauris quis luctus. Cras enim nibh, dignissim eu faucibus ac, mollis nec neque. "); - builder.append("Aliquam purus mauris, consectetur nec convallis lacinia, porta sed ante. Suspendisse "); - builder.append("et cursus magna. Donec orci enim, molestie a lobortis eu, imperdiet vitae neque."); - } - while (builder.length() < GzipResponseWrapper.DEFAULT_BUFFER_SIZE); - - __content = builder.toString(); - } - - @Rule - public TestingDir testdir = new TestingDir(); - - protected ServletTester tester; - - @Before - public void setUp() throws Exception - { - testdir.ensureEmpty(); - - File testFile = testdir.getFile("file.txt"); - BufferedOutputStream testOut = new BufferedOutputStream(new FileOutputStream(testFile)); - ByteArrayInputStream testIn = new ByteArrayInputStream(__content.getBytes("ISO8859_1")); - IO.copy(testIn,testOut); - testOut.close(); - - testFile = testdir.getFile("file.mp3"); - testOut = new BufferedOutputStream(new FileOutputStream(testFile)); - testIn = new ByteArrayInputStream(__content.getBytes("ISO8859_1")); - IO.copy(testIn,testOut); - testOut.close(); - - tester=new ServletTester(); - tester.setContextPath("/context"); - tester.setResourceBase(testdir.getDir().getCanonicalPath()); - tester.addServlet(getServletClass(), "/"); - FilterHolder holder = tester.addFilter(GzipFilter.class,"/*",0); - holder.setInitParameter("mimeTypes","text/plain"); - tester.start(); - } - - @After - public void tearDown() throws Exception - { - tester.stop(); - IO.delete(testdir.getDir()); - } - - public Class getServletClass() - { - return org.eclipse.jetty.servlet.DefaultServlet.class; - } - - @Test - public void testGzip() throws Exception - { - // generated and parsed test - HttpTester request = new HttpTester(); - HttpTester response = new HttpTester(); - - request.setMethod("GET"); - request.setVersion("HTTP/1.0"); - request.setHeader("Host","tester"); - request.setHeader("accept-encoding","gzip"); - request.setURI("/context/file.txt"); - - ByteArrayBuffer reqsBuff = new ByteArrayBuffer(request.generate().getBytes()); - ByteArrayBuffer respBuff = tester.getResponses(reqsBuff); - response.parse(respBuff.asArray()); - - assertTrue(response.getMethod()==null); - assertNotNull("Content-Length header is missing", response.getHeader("Content-Length")); - assertTrue(response.getHeader("Content-Encoding").equalsIgnoreCase("gzip")); - assertEquals(HttpServletResponse.SC_OK,response.getStatus()); - - InputStream testIn = new GZIPInputStream(new ByteArrayInputStream(response.getContentBytes())); - ByteArrayOutputStream testOut = new ByteArrayOutputStream(); - IO.copy(testIn,testOut); - - assertEquals(__content, testOut.toString("ISO8859_1")); - } - - @Test - public void testNotGzip() throws Exception - { - // generated and parsed test - HttpTester request = new HttpTester(); - HttpTester response = new HttpTester(); - - request.setMethod("GET"); - request.setVersion("HTTP/1.0"); - request.setHeader("Host","tester"); - request.setHeader("accept-encoding","gzip"); - request.setURI("/context/file.mp3"); - - ByteArrayBuffer reqsBuff = new ByteArrayBuffer(request.generate().getBytes()); - ByteArrayBuffer respBuff = tester.getResponses(reqsBuff); - response.parse(respBuff.asArray()); - - assertTrue(response.getMethod()==null); - assertNotNull("Content-Length header is missing", response.getHeader("Content-Length")); - assertEquals(__content.getBytes().length, Integer.parseInt(response.getHeader("Content-Length"))); - assertEquals(HttpServletResponse.SC_OK,response.getStatus()); - - InputStream testIn = new ByteArrayInputStream(response.getContentBytes()); - ByteArrayOutputStream testOut = new ByteArrayOutputStream(); - IO.copy(testIn,testOut); - - assertEquals(__content, testOut.toString("ISO8859_1")); - } -} diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterTest1.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterTest1.java deleted file mode 100644 index bb9a1e20077..00000000000 --- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterTest1.java +++ /dev/null @@ -1,56 +0,0 @@ -// ======================================================================== -// Copyright (c) 2004-2009 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; - -import java.io.IOException; - -import javax.servlet.ServletException; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -public class GzipFilterTest1 extends GzipFilterTest -{ - @Override - public Class getServletClass() - { - return TestServlet.class; - } - - - public static class TestServlet extends HttpServlet - { - private static final long serialVersionUID = -3603297003496724934L; - - /* ------------------------------------------------------------ */ - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException - { - byte[] dataBytes = GzipFilterTest.__content.getBytes("ISO8859_1"); - - ServletOutputStream out = response.getOutputStream(); - - response.setContentLength(dataBytes.length); - - String fileName = request.getServletPath(); - if (fileName.endsWith("txt")) - response.setContentType("text/plain"); - else if (fileName.endsWith("mp3")) - response.setContentType("audio/mpeg"); - - out.write(dataBytes); - } - } -} diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterTest2.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterTest2.java deleted file mode 100644 index 62d6d9cda12..00000000000 --- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterTest2.java +++ /dev/null @@ -1,54 +0,0 @@ -// ======================================================================== -// Copyright (c) 2004-2009 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; - -import java.io.IOException; - -import javax.servlet.ServletException; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -public class GzipFilterTest2 extends GzipFilterTest -{ - @Override - public Class getServletClass() - { - return TestServlet.class; - } - - public static class TestServlet extends HttpServlet - { - private static final long serialVersionUID = -3603297003496724934L; - - /* ------------------------------------------------------------ */ - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException - { - byte[] dataBytes = GzipFilterTest.__content.getBytes("ISO8859_1"); - - response.setContentLength(dataBytes.length); - - String fileName = request.getServletPath(); - if (fileName.endsWith("txt")) - response.setContentType("text/plain"); - else if (fileName.endsWith("mp3")) - response.setContentType("audio/mpeg"); - - ServletOutputStream out = response.getOutputStream(); - out.write(dataBytes); - } - } -} diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterTest3.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterTest3.java deleted file mode 100644 index 9fb89e0a17f..00000000000 --- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterTest3.java +++ /dev/null @@ -1,56 +0,0 @@ -// ======================================================================== -// Copyright (c) 2004-2009 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; - -import java.io.IOException; - -import javax.servlet.ServletException; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -public class GzipFilterTest3 extends GzipFilterTest -{ - @Override - public Class getServletClass() - { - return TestServlet.class; - } - - - public static class TestServlet extends HttpServlet - { - private static final long serialVersionUID = -3603297003496724934L; - - /* ------------------------------------------------------------ */ - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException - { - byte[] dataBytes = GzipFilterTest.__content.getBytes("ISO8859_1"); - - ServletOutputStream out = response.getOutputStream(); - - String fileName = request.getServletPath(); - if (fileName.endsWith("txt")) - response.setContentType("text/plain"); - else if (fileName.endsWith("mp3")) - response.setContentType("audio/mpeg"); - - response.setContentLength(dataBytes.length); - - out.write(dataBytes); - } - } -} diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterTest4.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterTest4.java deleted file mode 100644 index b64233319e2..00000000000 --- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterTest4.java +++ /dev/null @@ -1,54 +0,0 @@ -// ======================================================================== -// Copyright (c) 2004-2009 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; - -import java.io.IOException; - -import javax.servlet.ServletException; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -public class GzipFilterTest4 extends GzipFilterTest -{ - @Override - public Class getServletClass() - { - return TestServlet.class; - } - - public static class TestServlet extends HttpServlet - { - private static final long serialVersionUID = -3603297003496724934L; - - /* ------------------------------------------------------------ */ - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException - { - byte[] dataBytes = GzipFilterTest.__content.getBytes("ISO8859_1"); - - String fileName = request.getServletPath(); - if (fileName.endsWith("txt")) - response.setContentType("text/plain"); - else if (fileName.endsWith("mp3")) - response.setContentType("audio/mpeg"); - - response.setContentLength(dataBytes.length); - - ServletOutputStream out = response.getOutputStream(); - out.write(dataBytes); - } - } -} diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/GzipTester.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/GzipTester.java new file mode 100644 index 00000000000..f34eb3423b7 --- /dev/null +++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/GzipTester.java @@ -0,0 +1,369 @@ +package org.eclipse.jetty.servlets.gzip; + +import static org.hamcrest.Matchers.*; + +import java.io.BufferedOutputStream; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.security.DigestOutputStream; +import java.security.MessageDigest; +import java.util.Enumeration; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.zip.GZIPInputStream; + +import javax.servlet.Servlet; +import javax.servlet.http.HttpServletResponse; + +import org.eclipse.jetty.io.ByteArrayBuffer; +import org.eclipse.jetty.servlet.FilterHolder; +import org.eclipse.jetty.servlet.ServletHolder; +import org.eclipse.jetty.servlets.GzipFilter; +import org.eclipse.jetty.testing.HttpTester; +import org.eclipse.jetty.testing.ServletTester; +import org.eclipse.jetty.toolchain.test.IO; +import org.eclipse.jetty.toolchain.test.MavenTestingUtils; +import org.eclipse.jetty.toolchain.test.TestingDir; +import org.junit.Assert; + +public class GzipTester +{ + private String encoding = "ISO8859_1"; + private ServletTester servletTester; + private TestingDir testdir; + + public GzipTester(TestingDir testingdir) + { + this.testdir = testingdir; + // Make sure we start with a clean testing directory. + this.testdir.ensureEmpty(); + } + + public void assertIsResponseGzipCompressed(String filename) throws Exception + { + assertIsResponseGzipCompressed(filename,filename); + } + + public void assertIsResponseGzipCompressed(String requestedFilename, String serverFilename) throws Exception + { + System.err.printf("[GzipTester] requesting /context/%s%n",requestedFilename); + HttpTester request = new HttpTester(); + HttpTester response = new HttpTester(); + + request.setMethod("GET"); + request.setVersion("HTTP/1.0"); + request.setHeader("Host","tester"); + request.setHeader("Accept-Encoding","gzip"); + request.setURI("/context/" + requestedFilename); + + // Issue the request + ByteArrayBuffer reqsBuff = new ByteArrayBuffer(request.generate().getBytes()); + // Collect the response(s) + ByteArrayBuffer respBuff = servletTester.getResponses(reqsBuff); + response.parse(respBuff.asArray()); + + // Assert the response headers + Assert.assertThat("Response.method",response.getMethod(),nullValue()); + Assert.assertThat("Response.status",response.getStatus(),is(HttpServletResponse.SC_OK)); + Assert.assertThat("Response.header[Content-Length]",response.getHeader("Content-Length"),notNullValue()); + Assert.assertThat("Response.header[Content-Encoding]",response.getHeader("Content-Encoding"),containsString("gzip")); + + // Assert that the decompressed contents are what we expect. + File serverFile = testdir.getFile(serverFilename); + String expected = IO.readToString(serverFile); + String actual = null; + + ByteArrayInputStream bais = null; + InputStream in = null; + ByteArrayOutputStream out = null; + try + { + bais = new ByteArrayInputStream(response.getContentBytes()); + in = new GZIPInputStream(bais); + out = new ByteArrayOutputStream(); + IO.copy(in,out); + + actual = out.toString(encoding); + Assert.assertEquals("Uncompressed contents",expected,actual); + } + finally + { + IO.close(out); + IO.close(in); + IO.close(bais); + } + } + + /** + * Makes sure that the response contains an unfiltered file contents. + *

+ * This is used to test exclusions and passthroughs in the GzipFilter. + *

+ * An example is to test that it is possible to configure GzipFilter to not recompress content that shouldn't be + * compressed by the GzipFilter. + * + * @param requestedFilename + * the filename used to on the GET request,. + * @param testResourceSha1Sum + * the sha1sum file that contains the SHA1SUM checksum that will be used to verify that the response + * contents are what is intended. + */ + public void assertIsResponseNotGzipFiltered(String requestedFilename, String testResourceSha1Sum) throws Exception + { + System.err.printf("[GzipTester] requesting /context/%s%n",requestedFilename); + HttpTester request = new HttpTester(); + HttpTester response = new HttpTester(); + + request.setMethod("GET"); + request.setVersion("HTTP/1.0"); + request.setHeader("Host","tester"); + request.setHeader("Accept-Encoding","gzip"); + request.setURI("/context/" + requestedFilename); + + // Issue the request + ByteArrayBuffer reqsBuff = new ByteArrayBuffer(request.generate().getBytes()); + // Collect the response(s) + ByteArrayBuffer respBuff = servletTester.getResponses(reqsBuff); + response.parse(respBuff.asArray()); + + dumpHeaders(requestedFilename + " / Response Headers",response); + + // Assert the response headers + Assert.assertThat(requestedFilename + " / Response.method",response.getMethod(),nullValue()); + Assert.assertThat(requestedFilename + " / Response.status",response.getStatus(),is(HttpServletResponse.SC_OK)); + Assert.assertThat(requestedFilename + " / Response.header[Content-Length]",response.getHeader("Content-Length"),notNullValue()); + Assert.assertThat(requestedFilename + " / Response.header[Content-Encoding] (should not be recompressed by GzipFilter)", + response.getHeader("Content-Encoding"),nullValue()); + Assert.assertThat(requestedFilename + " / Response.header[Content-Type] (should have a Content-Type associated with it)", + response.getHeader("Content-Type"),notNullValue()); + + ByteArrayInputStream bais = null; + DigestOutputStream digester = null; + try + { + MessageDigest digest = MessageDigest.getInstance("SHA1"); + bais = new ByteArrayInputStream(response.getContentBytes()); + digester = new DigestOutputStream(new NoOpOutputStream(),digest); + IO.copy(bais,digester); + + String actualSha1Sum = Hex.asHex(digest.digest()); + String expectedSha1Sum = loadExpectedSha1Sum(testResourceSha1Sum); + Assert.assertEquals(requestedFilename + " / SHA1Sum of content",expectedSha1Sum,actualSha1Sum); + } + finally + { + IO.close(digester); + IO.close(bais); + } + } + + private void dumpHeaders(String prefix, HttpTester http) + { + System.out.println(prefix); + @SuppressWarnings("unchecked") + Enumeration names = http.getHeaderNames(); + while (names.hasMoreElements()) + { + String name = names.nextElement(); + String value = http.getHeader(name); + System.out.printf(" [%s] = %s%n",name,value); + } + } + + private String loadExpectedSha1Sum(String testResourceSha1Sum) throws IOException + { + File sha1File = MavenTestingUtils.getTestResourceFile(testResourceSha1Sum); + String contents = IO.readToString(sha1File); + Pattern pat = Pattern.compile("^[0-9A-Fa-f]*"); + Matcher mat = pat.matcher(contents); + Assert.assertTrue("Should have found HEX code in SHA1 file: " + sha1File,mat.find()); + return mat.group(); + } + + /** + * Asserts that the requested filename results in a properly structured GzipFilter response, where the content is + * not compressed, and the content-length is returned appropriately. + * + * @param filename + * the filename used for the request, and also used to compare the response to the server file, assumes + * that the file is suitable for {@link Assert#assertEquals(Object, Object)} use. (in other words, the + * contents of the file are text) + * @param expectedFilesize + * the expected filesize to be specified on the Content-Length portion of the response headers. (note: + * passing -1 will disable the Content-Length assertion) + * @throws Exception + */ + public void assertIsResponseNotGzipCompressed(String filename, int expectedFilesize) throws Exception + { + System.err.printf("[GzipTester] requesting /context/%s%n",filename); + HttpTester request = new HttpTester(); + HttpTester response = new HttpTester(); + + request.setMethod("GET"); + request.setVersion("HTTP/1.0"); + request.setHeader("Host","tester"); + request.setHeader("Accept-Encoding","gzip"); + request.setURI("/context/" + filename); + + // Issue the request + ByteArrayBuffer reqsBuff = new ByteArrayBuffer(request.generate().getBytes()); + // Collect the response(s) + ByteArrayBuffer respBuff = servletTester.getResponses(reqsBuff); + response.parse(respBuff.asArray()); + + // Assert the response headers + Assert.assertThat("Response.method",response.getMethod(),nullValue()); + Assert.assertThat("Response.status",response.getStatus(),is(HttpServletResponse.SC_OK)); + if (expectedFilesize != (-1)) + { + Assert.assertThat("Response.header[Content-Length]",response.getHeader("Content-Length"),notNullValue()); + int serverLength = Integer.parseInt(response.getHeader("Content-Length")); + Assert.assertThat("Response.header[Content-Length]",serverLength,is(expectedFilesize)); + } + Assert.assertThat("Response.header[Content-Encoding]",response.getHeader("Content-Encoding"),not(containsString("gzip"))); + + // Assert that the contents are what we expect. + File serverFile = testdir.getFile(filename); + String expected = IO.readToString(serverFile); + String actual = null; + + InputStream in = null; + ByteArrayOutputStream out = null; + try + { + in = new ByteArrayInputStream(response.getContentBytes()); + out = new ByteArrayOutputStream(); + IO.copy(in,out); + + actual = out.toString(encoding); + Assert.assertEquals("Server contents",expected,actual); + } + finally + { + IO.close(out); + IO.close(in); + } + } + + /** + * Generate string content of arbitrary length. + * + * @param length + * the length of the string to generate. + * @return the string content. + */ + public String generateContent(int length) + { + StringBuilder builder = new StringBuilder(); + do + { + builder.append("Lorem ipsum dolor sit amet, consectetur adipiscing elit. In quis felis nunc.\n"); + builder.append("Quisque suscipit mauris et ante auctor ornare rhoncus lacus aliquet. Pellentesque\n"); + builder.append("habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.\n"); + builder.append("Vestibulum sit amet felis augue, vel convallis dolor. Cras accumsan vehicula diam\n"); + builder.append("at faucibus. Etiam in urna turpis, sed congue mi. Morbi et lorem eros. Donec vulputate\n"); + builder.append("velit in risus suscipit lobortis. Aliquam id urna orci, nec sollicitudin ipsum.\n"); + builder.append("Cras a orci turpis. Donec suscipit vulputate cursus. Mauris nunc tellus, fermentum\n"); + builder.append("eu auctor ut, mollis at diam. Quisque porttitor ultrices metus, vitae tincidunt massa\n"); + builder.append("sollicitudin a. Vivamus porttitor libero eget purus hendrerit cursus. Integer aliquam\n"); + builder.append("consequat mauris quis luctus. Cras enim nibh, dignissim eu faucibus ac, mollis nec neque.\n"); + builder.append("Aliquam purus mauris, consectetur nec convallis lacinia, porta sed ante. Suspendisse\n"); + builder.append("et cursus magna. Donec orci enim, molestie a lobortis eu, imperdiet vitae neque.\n"); + } + while (builder.length() < length); + + // Make sure we are exactly at requested length. (truncate the extra) + if (builder.length() > length) + { + builder.setLength(length); + } + + return builder.toString(); + } + + public String getEncoding() + { + return encoding; + } + + /** + * Create a file on the server resource path of a specified filename and size. + * + * @param filename + * the filename to create + * @param filesize + * the file size to create (Note: this isn't suitable for creating large multi-megabyte files) + */ + public void prepareServerFile(String filename, int filesize) throws IOException + { + File testFile = testdir.getFile(filename); + + FileOutputStream fos = null; + BufferedOutputStream out = null; + ByteArrayInputStream in = null; + try + { + fos = new FileOutputStream(testFile,false); + out = new BufferedOutputStream(fos); + in = new ByteArrayInputStream(generateContent(filesize).getBytes(encoding)); + IO.copy(in,out); + } + finally + { + IO.close(in); + IO.close(out); + IO.close(fos); + } + } + + /** + * Set the servlet that provides content for the GzipFilter in being tested. + * + * @param servletClass + * the servlet that will provide content. + * @return the FilterHolder for configuring the GzipFilter's initParameters with + */ + public FilterHolder setContentServlet(Class servletClass) throws IOException + { + servletTester = new ServletTester(); + servletTester.setContextPath("/context"); + servletTester.setResourceBase(testdir.getDir().getCanonicalPath()); + ServletHolder servletHolder = servletTester.addServlet(servletClass,"/"); + servletHolder.setInitParameter("baseDir",testdir.getDir().getAbsolutePath()); + FilterHolder holder = servletTester.addFilter(GzipFilter.class,"/*",0); + return holder; + } + + public void setEncoding(String encoding) + { + this.encoding = encoding; + } + + public void start() throws Exception + { + Assert.assertThat("No servlet defined yet. Did you use #setContentServlet()?",servletTester,notNullValue()); + servletTester.dump(); + servletTester.start(); + } + + public void stop() + { + // NOTE: Do not cleanup the testdir. Failures can't be diagnosed if you do that. + // IO.delete(testdir.getDir()): + try + { + servletTester.stop(); + } + catch (Exception e) + { + // Don't toss this out into Junit as this would be the last exception + // that junit will report as being the cause of the test failure. + // when in reality, the earlier setup issue is the real cause. + e.printStackTrace(System.err); + } + } +} diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/Hex.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/Hex.java new file mode 100644 index 00000000000..ee17583c92b --- /dev/null +++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/Hex.java @@ -0,0 +1,58 @@ +package org.eclipse.jetty.servlets.gzip; + +public final class Hex +{ + private static final char[] hexcodes = "0123456789abcdef".toCharArray(); + + public static byte[] asByteArray(String id, int size) + { + if ((id.length() < 0) || (id.length() > (size * 2))) + { + throw new IllegalArgumentException(String.format("Invalid ID length of <%d> expected range of <0> to <%d>",id.length(),(size * 2))); + } + + byte buf[] = new byte[size]; + byte hex; + int len = id.length(); + + int idx = (int)Math.floor(((size * 2) - (double)len) / 2); + int i = 0; + if ((len % 2) != 0) + { // deal with odd numbered chars + i -= 1; + } + + for (; i < len; i++) + { + hex = 0; + if (i >= 0) + { + hex = (byte)(Character.digit(id.charAt(i),16) << 4); + } + i++; + hex += (byte)(Character.digit(id.charAt(i),16)); + + buf[idx] = hex; + idx++; + } + + return buf; + } + + public static String asHex(byte buf[]) + { + int len = buf.length; + char out[] = new char[len * 2]; + for (int i = 0; i < len; i++) + { + out[i * 2] = hexcodes[(buf[i] & 0xF0) >> 4]; + out[(i * 2) + 1] = hexcodes[(buf[i] & 0x0F)]; + } + return String.valueOf(out); + } + + private Hex() + { + /* prevent instantiation */ + } +} diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/NoOpOutputStream.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/NoOpOutputStream.java new file mode 100644 index 00000000000..0a3c857a0ab --- /dev/null +++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/NoOpOutputStream.java @@ -0,0 +1,40 @@ +package org.eclipse.jetty.servlets.gzip; + +import java.io.IOException; +import java.io.OutputStream; + +/** + * Stream that does nothing. (Used by SHA1SUM routines) + */ +public class NoOpOutputStream extends OutputStream +{ + @Override + public void close() throws IOException + { + /* noop */ + } + + @Override + public void flush() throws IOException + { + /* noop */ + } + + @Override + public void write(byte[] b) throws IOException + { + /* noop */ + } + + @Override + public void write(byte[] b, int off, int len) throws IOException + { + /* noop */ + } + + @Override + public void write(int b) throws IOException + { + /* noop */ + } +} diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestDirContentServlet.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestDirContentServlet.java new file mode 100644 index 00000000000..440528b332b --- /dev/null +++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestDirContentServlet.java @@ -0,0 +1,56 @@ +package org.eclipse.jetty.servlets.gzip; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; + +import org.eclipse.jetty.toolchain.test.PathAssert; +import org.eclipse.jetty.util.IO; + +@SuppressWarnings("serial") +public class TestDirContentServlet extends HttpServlet +{ + private File basedir; + + @Override + public void init(ServletConfig config) throws ServletException + { + basedir = new File(config.getInitParameter("baseDir")); + } + + public File getTestFile(String filename) + { + File testfile = new File(basedir,filename); + PathAssert.assertFileExists("Content File should exist",testfile); + return testfile; + } + + protected byte[] loadContentFileBytes(final String fileName) throws IOException + { + String relPath = fileName; + relPath = relPath.replaceFirst("^/context/",""); + relPath = relPath.replaceFirst("^/",""); + + File contentFile = getTestFile(relPath); + + FileInputStream in = null; + ByteArrayOutputStream out = null; + try + { + in = new FileInputStream(contentFile); + out = new ByteArrayOutputStream(); + IO.copy(in,out); + return out.toByteArray(); + } + finally + { + IO.close(out); + IO.close(in); + } + } +} diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletLengthTypeStreamWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletLengthTypeStreamWrite.java new file mode 100644 index 00000000000..4cf6a4acafe --- /dev/null +++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletLengthTypeStreamWrite.java @@ -0,0 +1,46 @@ +package org.eclipse.jetty.servlets.gzip; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.eclipse.jetty.servlets.GzipFilter; + +/** + * A sample servlet to serve static content, using a order of construction that has caused problems for + * {@link GzipFilter} in the past. + * + * Using a real-world pattern of: + * + *

+ *  1) set content length
+ *  2) set content type
+ *  3) get stream
+ *  4) write
+ * 
+ * + * @see http://bugs.eclipse.org/354014 + */ +@SuppressWarnings("serial") +public class TestServletLengthTypeStreamWrite extends TestDirContentServlet +{ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + String fileName = request.getServletPath(); + byte[] dataBytes = loadContentFileBytes(fileName); + + response.setContentLength(dataBytes.length); + + if (fileName.endsWith("txt")) + response.setContentType("text/plain"); + else if (fileName.endsWith("mp3")) + response.setContentType("audio/mpeg"); + + ServletOutputStream out = response.getOutputStream(); + out.write(dataBytes); + } +} \ No newline at end of file diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletStreamLengthTypeWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletStreamLengthTypeWrite.java new file mode 100644 index 00000000000..f10d5305ce3 --- /dev/null +++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletStreamLengthTypeWrite.java @@ -0,0 +1,47 @@ +package org.eclipse.jetty.servlets.gzip; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.eclipse.jetty.servlets.GzipFilter; + +/** + * A sample servlet to serve static content, using a order of construction that has caused problems for + * {@link GzipFilter} in the past. + * + * Using a real-world pattern of: + * + *
+ *  1) get stream
+ *  2) set content length
+ *  3) set content type
+ *  4) write
+ * 
+ * + * @see http://bugs.eclipse.org/354014 + */ +@SuppressWarnings("serial") +public class TestServletStreamLengthTypeWrite extends TestDirContentServlet +{ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + String fileName = request.getServletPath(); + byte[] dataBytes = loadContentFileBytes(fileName); + + ServletOutputStream out = response.getOutputStream(); + + response.setContentLength(dataBytes.length); + + if (fileName.endsWith("txt")) + response.setContentType("text/plain"); + else if (fileName.endsWith("mp3")) + response.setContentType("audio/mpeg"); + + out.write(dataBytes); + } +} \ No newline at end of file diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletStreamTypeLengthWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletStreamTypeLengthWrite.java new file mode 100644 index 00000000000..efd5bcdc12e --- /dev/null +++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletStreamTypeLengthWrite.java @@ -0,0 +1,47 @@ +package org.eclipse.jetty.servlets.gzip; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.eclipse.jetty.servlets.GzipFilter; + +/** + * A sample servlet to serve static content, using a order of construction that has caused problems for + * {@link GzipFilter} in the past. + * + * Using a real-world pattern of: + * + *
+ *  1) get stream
+ *  2) set content type
+ *  2) set content length
+ *  4) write
+ * 
+ * + * @see http://bugs.eclipse.org/354014 + */ +@SuppressWarnings("serial") +public class TestServletStreamTypeLengthWrite extends TestDirContentServlet +{ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + String fileName = request.getServletPath(); + byte[] dataBytes = loadContentFileBytes(fileName); + + ServletOutputStream out = response.getOutputStream(); + + if (fileName.endsWith("txt")) + response.setContentType("text/plain"); + else if (fileName.endsWith("mp3")) + response.setContentType("audio/mpeg"); + + response.setContentLength(dataBytes.length); + + out.write(dataBytes); + } +} \ No newline at end of file diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletTypeLengthStreamWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletTypeLengthStreamWrite.java new file mode 100644 index 00000000000..7551d4d4a6a --- /dev/null +++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletTypeLengthStreamWrite.java @@ -0,0 +1,46 @@ +package org.eclipse.jetty.servlets.gzip; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.eclipse.jetty.servlets.GzipFilter; + +/** + * A sample servlet to serve static content, using a order of construction that has caused problems for + * {@link GzipFilter} in the past. + * + * Using a real-world pattern of: + * + *
+ *  1) set content type
+ *  2) set content length
+ *  3) get stream
+ *  4) write
+ * 
+ * + * @see http://bugs.eclipse.org/354014 + */ +@SuppressWarnings("serial") +public class TestServletTypeLengthStreamWrite extends TestDirContentServlet +{ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + String fileName = request.getServletPath(); + byte[] dataBytes = loadContentFileBytes(fileName); + + if (fileName.endsWith("txt")) + response.setContentType("text/plain"); + else if (fileName.endsWith("mp3")) + response.setContentType("audio/mpeg"); + + response.setContentLength(dataBytes.length); + + ServletOutputStream out = response.getOutputStream(); + out.write(dataBytes); + } +} \ No newline at end of file diff --git a/jetty-servlets/src/test/resources/jetty_logo.bmp b/jetty-servlets/src/test/resources/jetty_logo.bmp new file mode 100644 index 0000000000000000000000000000000000000000..461ab66e7a899b92100f15e5afa3cf8597848549 GIT binary patch literal 90682 zcmeI537lL-wZ=0&doMGP6_SvIEF>f$`;H)shzJM*B0Nz+Hc=MAl|>On6yb@22*?)T zfhdcBiUJDA@(@%IP(axYyFgeB2}{!N|DAhlrqXloO!w_s8sDv7zI5N7drzG@Rdwpr zsZ({g+HuLJ>INwt1r7$IxZIh~x@5bnf?Yx=%y6d=AL3Kk z5$q6Rdp?3#`pWdUx4_y6Wj!T z0nPAnW?DCf zx8cP>bq%gP>ho!E7-#`$8W;)4N3&uO_DXj8jm7rOi^aB0D?>Z?3)yMc7c<#uu6|#F z?vjBiQkrWYN+1L6F9Opw`MLirw!Npa_EKs4io9QWdil05;d=4vVqxLy#lqYtirJ~Z zDK?M$?_$H?9kA8gT$|Jwcr-};iU?r zXtxbOnbIu#Rsvf?{w+{!oph0nGl|U0hDuR3lXd4wBBmP30{Oup&Q?_LQ^g7trb zV)Ock)QGN$86Ty0&^dYL{F#>Vu3gHftTn8@PVyo2gmQV%+_gJevNvlzZ3%;~X>OaH za#hv3Mq^5T<{!<+3|-ajk>K4R2iQzgnG%q#dJ8cBNZX<}v4gQGy4V^q{eJ-NlfG#g zcM3k7jM}8uPIm`=m9z$bAUFZYZyAT<`P*JVu>)~wB7Zmpd!sHD(%KI5<5eOn=yB((9gHl z{o&ll&4Fw_g#V@Y^w*kVVg5__ji7YmF2MV-nfuEIym_|}Sz6vkdij@#B^!Bd{9lE4C|yQvy|qjov*eAg#e!TV-aNg(=Rt-Y=U zHr}=^dJVm~yek&Iif+A+IFV6~pDTE#P(t!kqBE$j9v}S0^vzeh(h+U)$WFNe*|$4d zOL?vq{T7NZe_mx$d`x|QL9uDnk*pp58~Y@oeM6n*XWc`)8RE+RRp_VbKTiUmqezbe zttGpxIev#FV|T;05&7JSWHBKs&BZ^}FPveOLzp zwclF6q41%)PclA8f4>jx1Js^-vpkAN(_XaFF_51k({O&>9DEFX2J{v$;zKg}2G}2{ z{^V~Jb_3#3zv;g3gDb%e;FcKN%I|l8KY<6pi$HqHwIPdT&nYg$=2Hp$&T5zR{rbWp zNAptXyI32=_-zMNCRa9nuM}#-=YrLs*gWPNK^#z&KU`z-><9eyG41hj{P5NKjMi3) zb#=s~Ou0JVp9-z))ElsYI%4>bE1@NNwUDHX)i+K7F9G5)KOL4U!5Ct34y)0{ySqAl z44Uf$KS{^z0MrH_2QLHZc8zJZfH&deIdBXpN8hN8>_X?% zXXDV1RAJl59(cprc1ZUjKHGrmPWtd)K>1b!$>a@Syw?-knx99!Bf6lgpSz21Q?}oh zz)zF8cm!a#>;MhLZ$0Nw$G(H0Ni|Ro6JI1~9^(`>JnD1Kp(w{89Z%?JOt{b8O9@>l%jk zVtIx`bDe;GpqDp`U}^}zX{}ZLCcL+f=h)}gtMY{xnT8qQL#~ z#Z)7Yp~ZUqtc7{cCTy4L+pK+$Khu|?>UK7e9yIw@)dnRKe{TeS-IlT6iC=S3{3||n z zLhm=lGbmms^x0@Wf3#QVFDnmF%-|zx9KLt4Wx|<7*~dBdNenoM`)V0~s_jLEN7?cF zgSa%EKimndtz??V6gBp?j6D(m_~pc`-q4HXx!HUc+W#8ncPO8-VO&~|FS0T0?~=V@ z51Pju$8#6K%XPiVi}nGiorL+xCf*i2?DEgFOhgvDlm7|D){TBb{ayW+Q*6dpncL*11iVoe+HQ90FN*c;TRNH8 zr+lD=g)c|zN1FrSYZRDIfSvR7BL_w7SYes@E+05sRYW*pA=aa$lWTU$ujc4G6df*$Qr^T+yi zwsyS#37*@4pJY#*0k|h)`<>gCtm@K_RN76U>C!!nHZNoa-IKJ;fW`n^^lAZR6 zw=KkXkT4EfGRaQ4lCh^_ZfW^w4|>~z7~3ZFzcdd1u;WR7!WqC%TXJE#Tz*h1dsM%X zE+sapJ~zkFQXJ7ZpHK~bmoMdBP;45pzxkUq4@^|ArsI#J%qI7zpt(KxvuHOA*(tCC zlhW?f_KTjR%`~ysM`IoQJ`ENCKW)s#GGI1DfmrFpa;l^(@YOQmY}bzD!<+}!1=old z?fEIpc{m&+`nZo%ce&}eGauQ(vHn2za?v8&s|T;0kZn+8rZ`8AKmHvMa2 z`AOI0XZ?lvk@ZwZvMW~FCqA53?2))OVmfN-b?B%jSGULUoWCZavF$QoaeMih_m~Y6 z)h|U$J|ebHiI)6kM}k^SOJNKhzu4@}IQc}C)BjCn&Tafl=l9Us!kOSn#U^PEFWb?- zzm~p>x7La0x_P~P*rh(3z4?v5vlfZX+HYl%OgTrWuD;;flh5s5^_Z(VEd-U_Y=*a&6t{;>2Z8o0rcdlQ+9Ux<>x1 z#{f3|j>UGZx5Ta^y@9V~TPI7cJ&gx`+J*~Te`p?kEPCthNLq@IF3ej-y-aqr{f>oM|_|6KD>yFZ9s;%i50;+y&Y>l)Xi zuKyMY6qIem?x&8$O)Yu}oqeIEQnv}N1KUmxk;R(=bY<8Rx=)$J2JGaC5m{anZv zW6kWSc)dj%D9pvSY3^7jypCtueL^+zeHeV)2k_bKhiu~PzMku$9Ub31`m0WM_Nnn# z`!{57R^C<^XL(M#O8(`#=8<4j-$3?Q=NO~9(zv3e`ZvFm&cJMsT7N9N4{(+o`a^qu zw5HR*dTD)bF6SFg!S}-6J=T=vgV8>{y5_N94A{VI7Q=t~V}PI5;o_$N*^GtHC!+Nh?N9BpxpPhI9iG|ICsZTfHGYR<=m7uTkG=}Tx#+Rm$+4fw8gHTI5uz6xEV`N^C9 z-s4Kk@K1Qy1!#@bVn*8(dy=rOB-duvkVGpfn%4VF!ZAeSRv-`Q@1F9{po?;|?oY03 z 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 J6Vt4J|JiD@FQ)(i literal 0 HcmV?d00001 diff --git a/jetty-servlets/src/test/resources/jetty_logo.jp2.sha1 b/jetty-servlets/src/test/resources/jetty_logo.jp2.sha1 new file mode 100644 index 00000000000..b4fe6cd387c --- /dev/null +++ b/jetty-servlets/src/test/resources/jetty_logo.jp2.sha1 @@ -0,0 +1 @@ +c6f62de568243be3afbb7f489ce9096dc1808859 jetty_logo.jp2 diff --git a/jetty-servlets/src/test/resources/jetty_logo.jpeg b/jetty-servlets/src/test/resources/jetty_logo.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ea5294349e9b36d170c1c4e467bd4724ade04d31 GIT binary patch literal 6722 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 literal 0 HcmV?d00001 diff --git a/jetty-servlets/src/test/resources/jetty_logo.tga.sha1 b/jetty-servlets/src/test/resources/jetty_logo.tga.sha1 new file mode 100644 index 00000000000..2406e565929 --- /dev/null +++ b/jetty-servlets/src/test/resources/jetty_logo.tga.sha1 @@ -0,0 +1 @@ +2603caf728690e1fddaf747a3eef8b5cfe20eee4 jetty_logo.tga diff --git a/jetty-servlets/src/test/resources/jetty_logo.tif b/jetty-servlets/src/test/resources/jetty_logo.tif new file mode 100644 index 0000000000000000000000000000000000000000..6b33ac278015c071932f7b1bc99128992b59ab06 GIT binary patch literal 13284 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 W67u!+6?Fa|`zGA51wA~SZv8*XA_r;! literal 0 HcmV?d00001 diff --git a/jetty-servlets/src/test/resources/jetty_logo.tif.sha1 b/jetty-servlets/src/test/resources/jetty_logo.tif.sha1 new file mode 100644 index 00000000000..61ce10a4e96 --- /dev/null +++ b/jetty-servlets/src/test/resources/jetty_logo.tif.sha1 @@ -0,0 +1 @@ +35bbf5d78d6834531d4c43c686bdc49cded4c982 jetty_logo.tif diff --git a/jetty-servlets/src/test/resources/jetty_logo.tiff b/jetty-servlets/src/test/resources/jetty_logo.tiff new file mode 100644 index 0000000000000000000000000000000000000000..2f5b3971f4c4d4d72e8d6f9b0588af7c97d44566 GIT binary patch literal 13284 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 literal 0 HcmV?d00001 diff --git a/jetty-servlets/src/test/resources/jetty_logo.tiff.sha1 b/jetty-servlets/src/test/resources/jetty_logo.tiff.sha1 new file mode 100644 index 00000000000..1550704d40d --- /dev/null +++ b/jetty-servlets/src/test/resources/jetty_logo.tiff.sha1 @@ -0,0 +1 @@ +3f7fa94449b96c4670b8754850ec8fbe526db3f6 jetty_logo.tiff diff --git a/jetty-servlets/src/test/resources/jetty_logo.xcf b/jetty-servlets/src/test/resources/jetty_logo.xcf new file mode 100644 index 0000000000000000000000000000000000000000..02d91e95277c53818da3e813e5e96c75e4c14d36 GIT binary patch literal 11447 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 z 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 X|KA<3IE(-5L#$znT7v96w2T9 literal 0 HcmV?d00001 diff --git a/jetty-servlets/src/test/resources/jetty_logo.xcf.sha1 b/jetty-servlets/src/test/resources/jetty_logo.xcf.sha1 new file mode 100644 index 00000000000..d679a8081a6 --- /dev/null +++ b/jetty-servlets/src/test/resources/jetty_logo.xcf.sha1 @@ -0,0 +1 @@ +3ec782dc77c0b81420317d8d445f8d8c1ec25d84 jetty_logo.xcf diff --git a/jetty-servlets/src/test/resources/test_quotes.bz2 b/jetty-servlets/src/test/resources/test_quotes.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..8c01840b38b5d3b25af01e95a7413365fab2aeea GIT binary patch literal 594 zcmV-Y0FGjfiy+9{0nb++6F?M-QjRR1q1dkF0k)rTcGndI* z8(jh@5eQOvmRCh4%U2~_7DSngLx2mFCVHoqd(osPQ>Br0I5Xb+ z2tl%QRNsA;^I=?hKIxr`pdngK$14p zjcJWM_T@l?LE9T8ia$4Ku~pi~MtVX?JXD}2t`N{^N>^;`mR14oaG7vIcHu2LoYkHz zA;;nzh2O(vJ20$6BU(&XiQqs)#GH2tIV33PUafmVoLJznDh#<*lst|YWQ^Q?g4~8Y zpn-Z5zCW9$?U7xAj^&Cr>SLzKUZt53fzwdN@~Gd0jfEOHFMcchWbDsj=nwd-d&RdDxPIq3S>=0h5t_WJgGiXIpH{Q5N1+30Nzo6CdZ$Ew@0VV6 gj*eV`D2?O9IvNTndvItBk1az!{$kjp!yy*-E<4FCWD literal 0 HcmV?d00001 diff --git a/jetty-servlets/src/test/resources/test_quotes.bz2.sha1 b/jetty-servlets/src/test/resources/test_quotes.bz2.sha1 new file mode 100644 index 00000000000..5008ed045a9 --- /dev/null +++ b/jetty-servlets/src/test/resources/test_quotes.bz2.sha1 @@ -0,0 +1 @@ +1f8b327125e1ba9c25804734730dfe5367093216 test_quotes.bz2 diff --git a/jetty-servlets/src/test/resources/test_quotes.gz b/jetty-servlets/src/test/resources/test_quotes.gz new file mode 100644 index 0000000000000000000000000000000000000000..2a0d8e4fcae576df647c583ab23ddf370bff3d81 GIT binary patch literal 577 zcmV-H0>1qpiwFQ?6GTn|165PYZrd;ryyq+SmKF{C0qH3{q{tzC0Qmu$T*<7dU4dLh z;NN#hS}AJSfCbOa&diQ~Z)#k~ndNxij02g{tIJn<+g+5$yF2tYt{opJl4+H=JubLI{ literal 0 HcmV?d00001 diff --git a/jetty-servlets/src/test/resources/test_quotes.gz.sha1 b/jetty-servlets/src/test/resources/test_quotes.gz.sha1 new file mode 100644 index 00000000000..1b32785746b --- /dev/null +++ b/jetty-servlets/src/test/resources/test_quotes.gz.sha1 @@ -0,0 +1 @@ +f43ed550786662ba8a245a1769dfaa330c49fdcc test_quotes.gz diff --git a/jetty-servlets/src/test/resources/test_quotes.rar b/jetty-servlets/src/test/resources/test_quotes.rar new file mode 100644 index 0000000000000000000000000000000000000000..c5ab6a053a248ef263043878d0d54466684b707e GIT binary patch literal 679 zcmV;Y0$BZ0VR9iF2LR8Ia{vGh000000000XD0CozF92Nv000jJ000C1;4CDgR0}^H zGYWpi|2admHWWpgfccytZj49w8|7!^JDg)cd1uucIlmfsDdd^Y?5oCU+EN_sPP{_LWL3YQMDt?#Vl&Fn< zDLv;}Eax|K8cj5bNYK02(5*gHDxJty=e zrFya|T%3`=g#MC94a zEAH^pcwWJ&Za(xVPI!^jl62{VJs&W=$m&zczr5gxH_XK(-7;r3{x+&~MU^YI}B{9%;|itXha*b zsGL#iccXy^R$L)=V?Hz(^6*P;#mlb3y4nkI(Tu9$Ue(p3?L(ojAsZ#ioD)CB#W92( zJd@OApkUf?47y3%rIXnAtXT4muN4}mUH|74tm NKfegXJ$nE^2LM}5Lihjx literal 0 HcmV?d00001 diff --git a/jetty-servlets/src/test/resources/test_quotes.rar.sha1 b/jetty-servlets/src/test/resources/test_quotes.rar.sha1 new file mode 100644 index 00000000000..6aa4f4a6ed4 --- /dev/null +++ b/jetty-servlets/src/test/resources/test_quotes.rar.sha1 @@ -0,0 +1 @@ +8071787493e74d60a273bc0787d3666968dc9eb9 test_quotes.rar diff --git a/jetty-servlets/src/test/resources/test_quotes.txt b/jetty-servlets/src/test/resources/test_quotes.txt new file mode 100644 index 00000000000..04e2b04d658 --- /dev/null +++ b/jetty-servlets/src/test/resources/test_quotes.txt @@ -0,0 +1,19 @@ +Quotes attributed to Mark Twain: + + + A person with a new idea is a crank until the idea succeeds. + + A person who won't read has no advantage over one who can't read. + + Action speaks louder than words but not nearly as often. + + Buy land, they're not making it anymore. + + Good friends, good books and a sleepy conscience: this is the ideal life. + + It's no wonder that truth is stranger than fiction. Fiction has to make sense + + My books are like water; those of the great geniuses are wine. (Fortunately) everybody drinks water. + + My mother had a great deal of trouble with me, but I think she enjoyed it. + + Name the greatest of all inventors. Accident. + + Necessity is the mother of taking chances. + + Never put off till tomorrow what you can do the day after tomorrow. + + Only one thing is impossible for God: To find any sense in any copyright law on the planet. + + Part of the secret of a success in life is to eat what you like and let the food fight it out inside. + + There are lies, damned lies and statistics. + + + diff --git a/jetty-servlets/src/test/resources/test_quotes.txt.sha1 b/jetty-servlets/src/test/resources/test_quotes.txt.sha1 new file mode 100644 index 00000000000..fd2f9e96f87 --- /dev/null +++ b/jetty-servlets/src/test/resources/test_quotes.txt.sha1 @@ -0,0 +1 @@ +7dfe23b2baa0ad8fd1673bcbc9b981c4a564492a test_quotes.txt diff --git a/jetty-servlets/src/test/resources/test_quotes.zip b/jetty-servlets/src/test/resources/test_quotes.zip new file mode 100644 index 0000000000000000000000000000000000000000..57befe77ac458c6fc0449c7b0e45b5522976990a GIT binary patch literal 739 zcmWIWW@Zs#U}E54SRBG_|M!88iarwq13wE8GsrNMq!yRN7nbG&X}yw)lF$%N24*K= z7r$U2F0J5ZU}Sm0%)kI9LW57|-8K-|^IZGeG%?;kj4w59mz+?nW%$WBE9T^ym9dR6 zt`F{)dqinw-DqGvf9~9wzWV&Em=iOfR^01ho_T5Y>F}!Cu~Uxkw*KYhzoke|Ym58t z3Ca)WCMCEFPJXg^vUYBg;l$XAKS5^iXF6L7{ykq1cq{Z>uhDJ?@oFFU+1GMY%O{88YOB>r>dzkTPQn;p^#QFXQE@Bn( zj4ED*k2d~1`fj)PkA0kGoAxMr@rXFre14eRb@x%{yyMg51oW6@`m`=BP_9|qF0;c! z(EjZ?i+a{}u@s9^N#iEtS&@&zDiXeHT=?=ba&vCe#1MO7<&Ra@0yLj!D7=kvwiMIl zTE`=M_Q!%Z-)>D>bKCM`#?eFkw*RM#vHl8J(D1ZBEJW+pg5M9t{;BtNn~F^ra;;1^ zJiFrb5O<-Ruu3@6|ka^_N2F95%CG&DXa+vxw)Z zy?yX<_}Uk8_hbGR-R#pA{WjBG;IV(O*W=8$FXv5-dLsYm_tt1`;kH|UuB^Vbec=(V z*MVF@GPCaqh~3XRw4$h>`+>sSg_}i+#kyVZGaY%YAK=Z%B*%;^