001 // Copyright 2009, 2010 The Apache Software Foundation
002 //
003 // Licensed under the Apache License, Version 2.0 (the "License");
004 // you may not use this file except in compliance with the License.
005 // You may obtain a copy of the License at
006 //
007 // http://www.apache.org/licenses/LICENSE-2.0
008 //
009 // Unless required by applicable law or agreed to in writing, software
010 // distributed under the License is distributed on an "AS IS" BASIS,
011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 // See the License for the specific language governing permissions and
013 // limitations under the License.
014
015 package org.apache.tapestry5.internal.gzip;
016
017 import org.apache.tapestry5.internal.InternalConstants;
018 import org.apache.tapestry5.services.ResponseCompressionAnalyzer;
019
020 import javax.servlet.ServletOutputStream;
021 import javax.servlet.http.HttpServletRequest;
022 import javax.servlet.http.HttpServletResponse;
023 import javax.servlet.http.HttpServletResponseWrapper;
024 import java.io.IOException;
025
026 public class GZIPEnabledResponse extends HttpServletResponseWrapper
027 {
028 private final int cutover;
029
030 private final HttpServletRequest request;
031
032 private final HttpServletResponse response;
033
034 private final ResponseCompressionAnalyzer analyzer;
035
036 private boolean contentLengthSet = false;
037
038 public GZIPEnabledResponse(HttpServletResponse response, HttpServletRequest request, int cutover,
039 ResponseCompressionAnalyzer analyzer)
040 {
041 super(response);
042
043 this.request = request;
044 this.response = response;
045 this.cutover = cutover;
046 this.analyzer = analyzer;
047 }
048
049 public void setContentLength(int len)
050 {
051 super.setContentLength(len);
052
053 contentLengthSet = true;
054 }
055
056 @Override
057 public ServletOutputStream getOutputStream() throws IOException
058 {
059 if (contentLengthSet || isCompressionDisabled())
060 return super.getOutputStream();
061
062 String contentType = getContentType();
063
064 return new BufferedGZipOutputStream(contentType, response, cutover, analyzer);
065 }
066
067 private boolean isCompressionDisabled()
068 {
069 return request.getAttribute(InternalConstants.SUPPRESS_COMPRESSION) != null;
070 }
071 }