Coverage Report - net.sourceforge.pebble.web.filter.GZIPResponseWrapper
 
Classes in this File Line Coverage Branch Coverage Complexity
GZIPResponseWrapper
0%
0/46
0%
0/22
2.25
 
 1  
 /*
 2  
  * Copyright (c) 2003-2011, Simon Brown
 3  
  * All rights reserved.
 4  
  *
 5  
  * Redistribution and use in source and binary forms, with or without
 6  
  * modification, are permitted provided that the following conditions are met:
 7  
  *
 8  
  *   - Redistributions of source code must retain the above copyright
 9  
  *     notice, this list of conditions and the following disclaimer.
 10  
  *
 11  
  *   - Redistributions in binary form must reproduce the above copyright
 12  
  *     notice, this list of conditions and the following disclaimer in
 13  
  *     the documentation and/or other materials provided with the
 14  
  *     distribution.
 15  
  *
 16  
  *   - Neither the name of Pebble nor the names of its contributors may
 17  
  *     be used to endorse or promote products derived from this software
 18  
  *     without specific prior written permission.
 19  
  *
 20  
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 21  
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 22  
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 23  
  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 24  
  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 25  
  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 26  
  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 27  
  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 28  
  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 29  
  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 30  
  * POSSIBILITY OF SUCH DAMAGE.
 31  
  */
 32  
 package net.sourceforge.pebble.web.filter;
 33  
 
 34  
 import javax.servlet.ServletOutputStream;
 35  
 import javax.servlet.http.HttpServletResponse;
 36  
 import javax.servlet.http.HttpServletResponseWrapper;
 37  
 import java.io.IOException;
 38  
 import java.io.OutputStreamWriter;
 39  
 import java.io.PrintWriter;
 40  
 
 41  
 public class GZIPResponseWrapper extends HttpServletResponseWrapper {
 42  
 
 43  
   private final HttpServletResponse wrappedResponse;
 44  
   private final String encoding;
 45  
 
 46  
   private ServletOutputStream stream;
 47  
   private PrintWriter writer;
 48  
   private int status;
 49  
   private Integer contentLength;
 50  
 
 51  
   public GZIPResponseWrapper(HttpServletResponse wrappedResponse, String encoding) {
 52  0
     super(wrappedResponse);
 53  0
     this.wrappedResponse = wrappedResponse;
 54  0
     this.encoding = encoding;
 55  0
   }
 56  
 
 57  
   public ServletOutputStream createOutputStream() throws IOException {
 58  0
     if (shouldGzipResponse()) {
 59  0
       return (new GZIPResponseStream(wrappedResponse));
 60  
     } else {
 61  
       // If we aren't zipping the response, then we need to pass on the content length
 62  0
       if (contentLength != null) {
 63  0
         wrappedResponse.setContentLength(contentLength);
 64  
       }
 65  0
       return wrappedResponse.getOutputStream();
 66  
     }
 67  
   }
 68  
 
 69  
   private boolean shouldGzipResponse() {
 70  
     // PEBBLE-43 We shouldn't zip responses that are not allowed to have any content, because a zipped
 71  
     // empty response is actually 20 bytes long
 72  0
     return status != HttpServletResponse.SC_NOT_MODIFIED && status != HttpServletResponse.SC_NO_CONTENT;
 73  
   }
 74  
 
 75  
   public void finishResponse() {
 76  
     try {
 77  0
       if (writer != null) {
 78  0
         writer.close();
 79  
       } else {
 80  0
         if (stream != null) {
 81  0
           stream.close();
 82  
         }
 83  
       }
 84  0
     } catch (IOException e) {
 85  
       // Ignore
 86  0
     }
 87  0
   }
 88  
 
 89  
   public void flushBuffer() throws IOException {
 90  0
         if (stream != null) {
 91  0
           stream.flush();
 92  
         }
 93  0
   }
 94  
 
 95  
   public ServletOutputStream getOutputStream() throws IOException {
 96  0
     if (writer != null) {
 97  0
       throw new IllegalStateException("getWriter() has already been called!");
 98  
     }
 99  
 
 100  0
     if (stream == null)
 101  0
       stream = createOutputStream();
 102  0
     return (stream);
 103  
   }
 104  
 
 105  
   public PrintWriter getWriter() throws IOException {
 106  0
     if (writer != null) {
 107  0
       return (writer);
 108  
     }
 109  
 
 110  0
     if (stream != null) {
 111  0
       throw new IllegalStateException("getOutputStream() has already been called!");
 112  
     }
 113  
 
 114  0
     stream = createOutputStream();
 115  0
     writer = new PrintWriter(new OutputStreamWriter(stream, encoding));
 116  0
     return (writer);
 117  
   }
 118  
 
 119  
   public void setContentLength(int length) {
 120  0
     contentLength = length;
 121  0
   }
 122  
 
 123  
   @Override
 124  
   public void setStatus(int sc) {
 125  0
     this.status = sc;
 126  0
     super.setStatus(sc);
 127  0
   }
 128  
 
 129  
   @Override
 130  
   public void setStatus(int sc, String sm) {
 131  0
     this.status = sc;
 132  0
     super.setStatus(sc, sm);
 133  0
   }
 134  
 
 135  
   @Override
 136  
   public void sendError(int sc, String msg) throws IOException {
 137  0
     this.status = sc;
 138  0
     super.sendError(sc, msg);
 139  0
   }
 140  
 
 141  
   @Override
 142  
   public void sendError(int sc) throws IOException {
 143  0
     this.status = sc;
 144  0
     super.sendError(sc);
 145  0
   }
 146  
 }