/// <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 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); }