/// <summary>
        /// Get ahold of a <see cref="HttpCompressingFilter"/> for the given encoding scheme.
        /// If no encoding scheme can be found, it returns null.
        /// </summary>
        HttpCompressingFilter GetFilterForScheme(string schemes, Stream currentFilterStream)
        {
            // this makes a copy of the string.  i hate making copies.
            schemes = schemes.ToLower();

            bool foundDeflate = schemes.IndexOf("deflate") >= 0 ? true : false;
            bool foundGZip    = schemes.IndexOf("gzip") >= 0 ? true : false;

            HttpCompressionModuleSettings settings = HttpCompressionModuleSettings.GetSettings();

            // if they support the preferred algorithm, use it
            if (settings.PreferredAlgorithm == CompressionTypes.Deflate && foundDeflate)
            {
                return(new DeflateFilter(currentFilterStream, settings.CompressionLevel));
            }
            if (settings.PreferredAlgorithm == CompressionTypes.GZip && foundGZip)
            {
                return(new GZipFilter(currentFilterStream));
            }

            // otherwise, fall back to something they support, which preference to deflate (no reason)
            if (foundDeflate)
            {
                return(new DeflateFilter(currentFilterStream, settings.CompressionLevel));
            }
            if (foundGZip)
            {
                return(new GZipFilter(currentFilterStream));
            }

            // return null.  we couldn't find a filter.
            return(null);
        }
        /// <summary>
        /// Get the current settings from the xml config file
        /// </summary>
        public static HttpCompressionModuleSettings GetSettings()
        {
            HttpCompressionModuleSettings settings = (HttpCompressionModuleSettings)System.Configuration.ConfigurationSettings.GetConfig("blowery.web/httpCompressionModule");

            if (settings == null)
            {
                return(HttpCompressionModuleSettings.DEFAULT);
            }
            else
            {
                return(settings);
            }
        }
        /// <summary>
        /// Get ahold of a <see cref="HttpCompressingFilter"/> for the given encoding scheme.
        /// If no encoding scheme can be found, it returns null.
        /// </summary>
        HttpCompressingFilter GetFilterForScheme(string[] schemes, Stream currentFilterStream)
        {
            bool foundDeflate = false;
            bool foundGZip    = false;
            bool foundStar    = false;

            float deflateQuality = 0;
            float gZipQuality    = 0;
            float starQuality    = 0;

            bool isAcceptableDeflate;
            bool isAcceptableGZip;
            bool isAcceptableStar;

            for (int i = 0; i < schemes.Length; i++)
            {
                string acceptEncodingValue = schemes[i].Trim().ToLower();

                if (acceptEncodingValue.StartsWith("deflate"))
                {
                    foundDeflate = true;

                    float newDeflateQuality = GetQuality(acceptEncodingValue);
                    if (deflateQuality < newDeflateQuality)
                    {
                        deflateQuality = newDeflateQuality;
                    }
                }

                if (acceptEncodingValue.StartsWith("gzip") || acceptEncodingValue.StartsWith("x-gzip"))
                {
                    foundGZip = true;

                    float newGZipQuality = GetQuality(acceptEncodingValue);
                    if (gZipQuality < newGZipQuality)
                    {
                        gZipQuality = newGZipQuality;
                    }
                }

                if (acceptEncodingValue.StartsWith("*"))
                {
                    foundStar = true;

                    float newStarQuality = GetQuality(acceptEncodingValue);
                    if (starQuality < newStarQuality)
                    {
                        starQuality = newStarQuality;
                    }
                }
            }

            isAcceptableStar    = foundStar && (starQuality > 0);
            isAcceptableDeflate = (foundDeflate && (deflateQuality > 0)) || (!foundDeflate && isAcceptableStar);
            isAcceptableGZip    = (foundGZip && (gZipQuality > 0)) || (!foundGZip && isAcceptableStar);

            if (isAcceptableDeflate && !foundDeflate)
            {
                deflateQuality = starQuality;
            }

            if (isAcceptableGZip && !foundGZip)
            {
                gZipQuality = starQuality;
            }

            HttpCompressionModuleSettings settings = HttpCompressionModuleSettings.GetSettings();

            if (isAcceptableDeflate && (!isAcceptableGZip || (deflateQuality > gZipQuality)))
            {
                return(new DeflateFilter(currentFilterStream, settings.CompressionLevel));
            }
            if (isAcceptableGZip && (!isAcceptableDeflate || (deflateQuality < gZipQuality)))
            {
                return(new GZipFilter(currentFilterStream));
            }

            // if they support the preferred algorithm, use it
            if (isAcceptableDeflate && settings.PreferredAlgorithm == CompressionTypes.Deflate)
            {
                return(new DeflateFilter(currentFilterStream, settings.CompressionLevel));
            }
            if (isAcceptableGZip && settings.PreferredAlgorithm == CompressionTypes.GZip)
            {
                return(new GZipFilter(currentFilterStream));
            }

            // return null.  we couldn't find a filter.
            return(null);
        }