001 // Copyright 2009, 2010, 2012 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.services;
016
017 import org.apache.tapestry5.SymbolConstants;
018 import org.apache.tapestry5.internal.TapestryInternalUtils;
019 import org.apache.tapestry5.ioc.annotations.Symbol;
020 import org.apache.tapestry5.services.ResponseCompressionAnalyzer;
021 import org.apache.tapestry5.services.assets.CompressionAnalyzer;
022
023 import javax.servlet.http.HttpServletRequest;
024 import java.util.Collection;
025
026 public class ResponseCompressionAnalyzerImpl implements ResponseCompressionAnalyzer
027 {
028 private final HttpServletRequest request;
029
030 private final boolean gzipCompressionEnabled;
031
032 private final CompressionAnalyzer analyzer;
033
034 // configuration is left here for partial compatibility with end-user modules that contribute a value; they
035 // should contribute to CompressionAnalyzer instead.
036 public ResponseCompressionAnalyzerImpl(HttpServletRequest request, CompressionAnalyzer analyzer, @Deprecated
037 Collection<String> configuration, @Symbol(SymbolConstants.GZIP_COMPRESSION_ENABLED)
038 boolean gzipCompressionEnabled)
039 {
040 this.request = request;
041 this.analyzer = analyzer;
042 this.gzipCompressionEnabled = gzipCompressionEnabled;
043 }
044
045 public boolean isGZipSupported()
046 {
047 if (!gzipCompressionEnabled)
048 {
049 return false;
050 }
051
052 // TAP5-1880:
053 if (request.getProtocol() == "HTTP/1.0")
054 {
055 return false;
056 }
057
058 String supportedEncodings = request.getHeader("Accept-Encoding");
059
060 if (supportedEncodings == null)
061 {
062 return false;
063 }
064
065 for (String encoding : TapestryInternalUtils.splitAtCommas(supportedEncodings))
066 {
067 if (encoding.equalsIgnoreCase("gzip"))
068 {
069 return true;
070 }
071 }
072
073 return false;
074 }
075
076 public boolean isCompressable(String contentType)
077 {
078 return analyzer.isCompressable(contentType);
079 }
080 }