    001// Licensed under the Apache License, Version 2.0 (the "License");
    002// you may not use this file except in compliance with the License.
    003// You may obtain a copy of the License at
    004//
    005// http://www.apache.org/licenses/LICENSE-2.0
    006//
    007// Unless required by applicable law or agreed to in writing, software
    008// distributed under the License is distributed on an "AS IS" BASIS,
    009// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    010// See the License for the specific language governing permissions and
    011// limitations under the License.
    012
    013package org.apache.tapestry5.internal.services;
    014
    015import org.apache.tapestry5.ContentType;
    016import org.apache.tapestry5.SymbolConstants;
    017import org.apache.tapestry5.internal.InternalConstants;
    018import org.apache.tapestry5.internal.TapestryInternalUtils;
    019import org.apache.tapestry5.ioc.annotations.Symbol;
    020import org.apache.tapestry5.services.ResponseCompressionAnalyzer;
    021import org.apache.tapestry5.services.assets.CompressionAnalyzer;
    022
    023import javax.servlet.http.HttpServletRequest;
    024
    025public class ResponseCompressionAnalyzerImpl implements ResponseCompressionAnalyzer
    026{
    027    private final HttpServletRequest request;
    028
    029    private final boolean gzipCompressionEnabled;
    030
    031    private final CompressionAnalyzer compressionAnalyzer;
    032
    033    public ResponseCompressionAnalyzerImpl(HttpServletRequest request,
    034                                           @Symbol(SymbolConstants.GZIP_COMPRESSION_ENABLED)
    035                                           boolean gzipCompressionEnabled, CompressionAnalyzer compressionAnalyzer)
    036    {
    037        this.request = request;
    038        this.gzipCompressionEnabled = gzipCompressionEnabled;
    039        this.compressionAnalyzer = compressionAnalyzer;
    040    }
    041
    042    public boolean isGZipSupported()
    043    {
    044        if (!gzipCompressionEnabled)
    045        {
    046            return false;
    047        }
    048
    049        // TAP5-1880:
    050        if (request.getProtocol() == "HTTP/1.0")
    051        {
    052            return false;
    053        }
    054
    055        // TAP5-2264:
    056        if (request.getAttribute(InternalConstants.SUPPRESS_COMPRESSION) != null)
    057        {
    058            return false;
    059        }
    060
    061        String supportedEncodings = request.getHeader("Accept-Encoding");
    062
    063        if (supportedEncodings == null)
    064        {
    065            return false;
    066        }
    067
    068        for (String encoding : TapestryInternalUtils.splitAtCommas(supportedEncodings))
    069        {
    070            if (encoding.equalsIgnoreCase("gzip"))
    071            {
    072                return true;
    073            }
    074        }
    075
    076        return false;
    077    }
    078
    079    public boolean isGZipEnabled(ContentType contentType)
    080    {
    081        return isGZipSupported() && compressionAnalyzer.isCompressable(contentType.getMimeType());
    082    }
    083}