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
015package org.apache.tapestry5.internal.services;
016
017import org.apache.tapestry5.SymbolConstants;
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;
024import java.util.Collection;
025
026public 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}