1   package org.mortbay.servlet.jetty;
2   
3   import java.io.IOException;
4   
5   import javax.servlet.http.HttpServletRequest;
6   import javax.servlet.http.HttpServletResponse;
7   
8   import org.mortbay.jetty.HttpConnection;
9   import org.mortbay.servlet.GzipFilter;
10  
11  /* ------------------------------------------------------------ */
12  /** Includable GZip Filter.
13   * This extension to the {@link GzipFilter} that uses Jetty APIs to allow
14   * headers to be set during calls to 
15   * {@link javax.servlet.RequestDispatcher#include(javax.servlet.ServletRequest, javax.servlet.ServletResponse)}.
16   * This allows the gzip filter to function correct during includes and to make a decision to gzip or not
17   * at the time the buffer fills and on the basis of all response headers.
18   * 
19   * @author gregw
20   *
21   */
22  public class IncludableGzipFilter extends GzipFilter
23  {
24  
25      protected GZIPResponseWrapper newGZIPResponseWrapper(HttpServletRequest request, HttpServletResponse response)
26      {
27          return new IncludableResponseWrapper(request,response);
28      }
29  
30      public class IncludableResponseWrapper extends GzipFilter.GZIPResponseWrapper
31      {
32          public IncludableResponseWrapper(HttpServletRequest request, HttpServletResponse response)
33          {
34              super(request,response);
35          }
36          
37          protected GzipStream newGzipStream(HttpServletRequest request,HttpServletResponse response,long contentLength,int bufferSize, int minGzipSize) throws IOException
38          {
39              return new IncludableGzipStream(request,response,contentLength,bufferSize,minGzipSize);
40          }
41      }
42      
43      public class IncludableGzipStream extends GzipFilter.GzipStream
44      {
45          public IncludableGzipStream(HttpServletRequest request, HttpServletResponse response, long contentLength, int bufferSize, int minGzipSize)
46                  throws IOException
47          {
48              super(request,response,contentLength,bufferSize,minGzipSize);
49          }
50  
51          protected boolean setContentEncodingGzip()
52          {
53              HttpConnection connection = HttpConnection.getCurrentConnection();
54              connection.getResponseFields().put("Content-Encoding", "gzip");
55              return true;
56          }
57          
58      }
59      
60  }