Merge remote-tracking branch 'origin/jetty-7' into jetty-8

Conflicts:
	jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipWithPipeliningTest.java
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
index 885a01d..8834aa6 100644
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterContentLengthTest.java
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterContentLengthTest.java
@@ -135,7 +135,7 @@
         {
             tester.start();
             HttpTester response = tester.assertIsResponseNotGzipCompressed("GET",testfile.getName(),filesize,HttpStatus.OK_200);
-            Assert.assertThat(response.getHeader("ETAG"),Matchers.startsWith("w/etag-"));
+            Assert.assertThat(response.getHeader("ETAG"),Matchers.startsWith("W/etag-"));
         }
         finally
         {
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipWithPipeliningTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipWithPipeliningTest.java
deleted file mode 100644
index 19dd994..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipWithPipeliningTest.java
+++ /dev/null
@@ -1,266 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2013 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.hamcrest.Matchers.containsString;
-import static org.hamcrest.Matchers.greaterThan;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.not;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.security.DigestOutputStream;
-import java.security.MessageDigest;
-import java.util.EnumSet;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.zip.GZIPInputStream;
-import java.util.zip.Inflater;
-import java.util.zip.InflaterInputStream;
-
-import javax.servlet.DispatcherType;
-
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.servlet.DefaultServlet;
-import org.eclipse.jetty.servlet.FilterHolder;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.eclipse.jetty.servlets.gzip.Hex;
-import org.eclipse.jetty.servlets.gzip.NoOpOutputStream;
-import org.eclipse.jetty.toolchain.test.IO;
-import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
-import org.eclipse.jetty.toolchain.test.TestingDir;
-import org.junit.After;
-import org.junit.Before;
-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 effects of Gzip filtering when in the context of HTTP/1.1 Pipelining.
- */
-@RunWith(Parameterized.class)
-public class GzipWithPipeliningTest
-{
-    @Parameters
-    public static Collection<String[]> data()
-    {
-        // Test different Content-Encoding header combinations. So implicitly testing that gzip is preferred oder deflate
-        String[][] data = new String[][]
-                {
-                { GzipFilter.GZIP },
-                { GzipFilter.DEFLATE + ", " + GzipFilter.GZIP },
-                { GzipFilter.GZIP + ", " + GzipFilter.DEFLATE },
-                { GzipFilter.DEFLATE } 
-                };
-        
-        return Arrays.asList(data);
-    }
-    
-    @Rule
-    public TestingDir testingdir = new TestingDir();
-    
-    private Server server;
-    private URI serverUri;
-    private String encodingHeader;
-    
-    
-    public GzipWithPipeliningTest(String encodingHeader)
-    {
-        this.encodingHeader = encodingHeader;
-    }
-
-    @Before
-    public void startServer() throws Exception
-    {
-        // Configure Server
-        server = new Server(0);
-
-        ServletContextHandler context = new ServletContextHandler();
-        context.setContextPath("/");
-
-        DefaultServlet servlet = new DefaultServlet();
-        ServletHolder holder = new ServletHolder(servlet);
-        holder.setInitParameter("resourceBase",MavenTestingUtils.getTestResourcesDir().getAbsolutePath());
-        context.addServlet(holder,"/");
-
-        FilterHolder filter = context.addFilter(GzipFilter.class,"/*", EnumSet.of(DispatcherType.REQUEST));
-        filter.setInitParameter("mimeTypes","text/plain");
-
-        server.setHandler(context);
-
-        // Start Server
-        server.start();
-
-        Connector conn = server.getConnectors()[0];
-        String host = conn.getHost();
-        if (host == null)
-        {
-            host = "localhost";
-        }
-        int port = conn.getLocalPort();
-        serverUri = new URI(String.format("ws://%s:%d/",host,port));
-        // System.out.printf("Server URI: %s%n",serverUri);
-    }
-
-    @After
-    public void stopServer() throws Exception
-    {
-        server.stop();
-    }
-    
-    @Test
-    public void testGzipThenImagePipelining() throws Exception
-    {
-        testingdir.ensureEmpty();
-        File outputDir = testingdir.getDir(); 
-        
-        PipelineHelper client = new PipelineHelper(serverUri, encodingHeader);
-
-        try
-        {
-            File txtFile = MavenTestingUtils.getTestResourceFile("lots-of-fantasy-names.txt");
-            File pngFile = MavenTestingUtils.getTestResourceFile("jetty_logo.png");
-
-            // Size of content, as it exists on disk, without gzip compression.
-            long rawsize = txtFile.length() + pngFile.length();
-            assertThat("Ensure that we have sufficient file size to trigger chunking",rawsize,greaterThan(300000L));
-
-            String respHeader;
-
-            client.connect();
-
-            // Request text that will be gzipped + chunked in the response
-            client.issueGET("/lots-of-fantasy-names.txt",true, false);
-
-            respHeader = client.readResponseHeader();
-            System.out.println("Response Header #1 --\n" + respHeader);
-            String expectedEncodingHeader = encodingHeader.equals(GzipFilter.DEFLATE) ? GzipFilter.DEFLATE : GzipFilter.GZIP;
-            assertThat("Content-Encoding should be gzipped",respHeader,containsString("Content-Encoding: " + expectedEncodingHeader + "\r\n"));
-            assertThat("Transfer-Encoding should be chunked",respHeader,containsString("Transfer-Encoding: chunked\r\n"));
-
-            // Raw output / gzipped, writted to disk (checked for sha1sum later)
-            File rawOutputFile = new File(outputDir, "response-1.gz");
-            FileOutputStream rawOutputStream = new FileOutputStream(rawOutputFile);
-
-            long chunkSize = client.readChunkSize();
-            System.out.println("Chunk Size: " + chunkSize);
-
-            // Read only 20% - intentionally a partial read.
-            System.out.println("Attempting to read partial content ...");
-            int readBytes = client.readBody(rawOutputStream,(int)(chunkSize * 0.20f));
-            System.out.printf("Read %,d bytes%n",readBytes);
-
-            // Issue another request
-            client.issueGET("/jetty_logo.png",true, false);
-
-            // Finish reading chunks
-            System.out.println("Finish reading remaining chunks ...");
-            String line;
-            chunkSize = chunkSize - readBytes;
-            while (chunkSize > 0)
-            {
-                readBytes = client.readBody(rawOutputStream,(int)chunkSize);
-                System.out.printf("Read %,d bytes%n",readBytes);
-                line = client.readLine();
-                assertThat("Chunk delim should be an empty line with CR+LF",line,is(""));
-                chunkSize = client.readChunkSize();
-                System.out.printf("Next Chunk: (0x%X) %,d bytes%n",chunkSize,chunkSize);
-            }
-
-            // Inter-pipeline delim
-            line = client.readLine();
-            assertThat("Inter-pipeline delim should be an empty line with CR+LF",line,is(""));
-            
-            // Sha1tracking for 1st Request
-            MessageDigest digestTxt = MessageDigest.getInstance("SHA1");
-            DigestOutputStream digesterTxt = new DigestOutputStream(new NoOpOutputStream(),digestTxt);
-
-            // Decompress 1st request and calculate sha1sum
-            IO.close(rawOutputStream);
-            FileInputStream rawInputStream = new FileInputStream(rawOutputFile);
-            InputStream uncompressedStream = null;
-            if (GzipFilter.DEFLATE.equals(encodingHeader))
-            {
-                uncompressedStream = new InflaterInputStream(rawInputStream, new Inflater(true));
-            }
-            else
-            {
-                uncompressedStream = new GZIPInputStream(rawInputStream);
-            }
-
-            IO.copy(uncompressedStream, digesterTxt);
-            
-            // Read 2nd request http response header
-            respHeader = client.readResponseHeader();
-            System.out.println("Response Header #2 --\n" + respHeader);
-            assertThat("Content-Encoding should NOT be gzipped",respHeader,not(containsString("Content-Encoding: gzip\r\n")));
-            assertThat("Transfer-Encoding should NOT be chunked",respHeader,not(containsString("Transfer-Encoding: chunked\r\n")));
-
-            // Sha1tracking for 2nd Request
-            MessageDigest digestImg = MessageDigest.getInstance("SHA1");
-            DigestOutputStream digesterImg = new DigestOutputStream(new NoOpOutputStream(),digestImg);
-
-            // Read 2nd request body
-            int contentLength = client.getContentLength(respHeader);
-            assertThat("Image Content Length",(long)contentLength,is(pngFile.length()));
-            client.readBody(digesterImg,contentLength);
-
-            // Validate checksums
-            IO.close(rawOutputStream);
-            assertChecksum("lots-of-fantasy-names.txt",digestTxt);
-            IO.close(digesterImg);
-            assertChecksum("jetty_logo.png",digestImg);
-        }
-        finally
-        {
-            client.disconnect();
-        }
-    }
-
-    private void assertChecksum(String testResourceFile, MessageDigest digest) throws IOException
-    {
-        String expectedSha1 = loadSha1sum(testResourceFile + ".sha1");
-        String actualSha1 = Hex.asHex(digest.digest());
-        assertEquals(testResourceFile + " / SHA1Sum of content",expectedSha1,actualSha1);
-    }
-
-    private String loadSha1sum(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);
-        assertTrue("Should have found HEX code in SHA1 file: " + sha1File,mat.find());
-        return mat.group();
-    }
-
-}
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
index 7a09b57..5b92a94 100644
--- 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
@@ -194,7 +194,7 @@
         Assert.assertThat(prefix + ".header[Content-Type] (should have a Content-Type associated with it)",response.getHeader("Content-Type"),notNullValue());
         Assert.assertThat(prefix + ".header[Content-Type]",response.getHeader("Content-Type"),is(expectedContentType));
 
-        Assert.assertThat(response.getHeader("ETAG"),Matchers.startsWith("w/etag-"));
+        Assert.assertThat(response.getHeader("ETAG"),Matchers.startsWith("W/"));
         
         ByteArrayInputStream bais = null;
         DigestOutputStream digester = null;
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestMinGzipSizeServlet.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestMinGzipSizeServlet.java
index 6883f9a..697ee3b 100644
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestMinGzipSizeServlet.java
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestMinGzipSizeServlet.java
@@ -51,6 +51,7 @@
         byte[] dataBytes = loadContentFileBytes(fileName);
 
         response.setContentLength(dataBytes.length);
+        response.setHeader("ETag","W/etag-"+fileName);
         if (fileName.endsWith(".js"))
         {
             // intentionally long-form content type to test ";" splitting in code
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletLengthStreamTypeWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletLengthStreamTypeWrite.java
index c318fac..8e873db 100644
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletLengthStreamTypeWrite.java
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletLengthStreamTypeWrite.java
@@ -59,7 +59,7 @@
             response.setContentType("text/plain");
         else if (fileName.endsWith("mp3"))
             response.setContentType("audio/mpeg");
-        response.setHeader("ETag","w/etag-"+fileName);
+        response.setHeader("ETag","W/etag-"+fileName);
 
         out.write(dataBytes);
     }
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
index 227fc9f..bcde21b 100644
--- 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
@@ -57,7 +57,7 @@
             response.setContentType("text/plain");
         else if (fileName.endsWith("mp3"))
             response.setContentType("audio/mpeg");
-        response.setHeader("ETag","w/etag-"+fileName);
+        response.setHeader("ETag","W/etag-"+fileName);
 
         ServletOutputStream out = response.getOutputStream();
         out.write(dataBytes);
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
index b54fcdc..97131ca 100644
--- 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
@@ -59,7 +59,7 @@
             response.setContentType("text/plain");
         else if (fileName.endsWith("mp3"))
             response.setContentType("audio/mpeg");
-        response.setHeader("ETag","w/etag-"+fileName);
+        response.setHeader("ETag","W/etag-"+fileName);
 
         out.write(dataBytes);
     }
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
index 54ca278..3f216b3 100644
--- 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
@@ -57,7 +57,7 @@
             response.setContentType("text/plain");
         else if (fileName.endsWith("mp3"))
             response.setContentType("audio/mpeg");
-        response.setHeader("ETag","w/etag-"+fileName);
+        response.setHeader("ETag","W/etag-"+fileName);
 
         response.setContentLength(dataBytes.length);
 
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
index 2ae83ee..4650b51 100644
--- 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
@@ -55,7 +55,7 @@
             response.setContentType("text/plain");
         else if (fileName.endsWith("mp3"))
             response.setContentType("audio/mpeg");
-        response.setHeader("ETag","w/etag-"+fileName);
+        response.setHeader("ETag","W/etag-"+fileName);
 
         response.setContentLength(dataBytes.length);
 
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletTypeStreamLengthWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletTypeStreamLengthWrite.java
index 67c1e72..b5152e0 100644
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletTypeStreamLengthWrite.java
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletTypeStreamLengthWrite.java
@@ -55,7 +55,7 @@
             response.setContentType("text/plain");
         else if (fileName.endsWith("mp3"))
             response.setContentType("audio/mpeg");
-        response.setHeader("ETag","w/etag-"+fileName);
+        response.setHeader("ETag","W/etag-"+fileName);
 
         ServletOutputStream out = response.getOutputStream();
 
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestStaticMimeTypeServlet.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestStaticMimeTypeServlet.java
index 701088a..16f00b0 100644
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestStaticMimeTypeServlet.java
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestStaticMimeTypeServlet.java
@@ -68,6 +68,7 @@
         byte[] dataBytes = loadContentFileBytes(fileName);
 
         response.setContentLength(dataBytes.length);
+        response.setHeader("ETag","W/etag-"+fileName);
 
         Buffer buf = mimeTypes.getMimeByExtension(fileName);
         if (buf == null)