Пример #1
0
        /// <summary>
        /// 压缩数据
        /// </summary>
        /// <param name="isFastestCompressionLevel"></param>
        internal void Compress(bool isFastestCompressionLevel)
#endif
        {
            switch (Type)
            {
            case Net.Http.ResponseType.ByteArray:
                Body.SetFull();
                goto SUBBYTEARRAY;

            case Net.Http.ResponseType.SubByteArray:
SUBBYTEARRAY:
                if (Body.Length > GZipHeaderSize + 256)
                {
                    SubArray <byte> compressData = new SubArray <byte>();
                    try
                    {
#if DOTNET2 || DOTNET4
                        if (AutoCSer.IO.Compression.GzipCompressor.Get(Body.Array, Body.Start, Body.Length, ref SubBuffer, ref compressData, 0, GZipHeaderSize))
#else
                        if (AutoCSer.IO.Compression.GzipCompressor.Get(Body.Array, Body.Start, Body.Length, ref SubBuffer, ref compressData, 0, GZipHeaderSize, isFastestCompressionLevel))
#endif
                        {
                            Body            = compressData;
                            Type            = compressData.Array == SubBuffer.Buffer ? ResponseType.SubBuffer : ResponseType.SubByteArray;
                            ContentEncoding = GZipEncoding;
                            Flag           |= ResponseFlag.ContentEncoding;
                        }
                    }
                    finally
                    {
                        if (Type != ResponseType.SubBuffer)
                        {
                            SubBuffer.Free();
                        }
                    }
                }
                return;

            case Net.Http.ResponseType.SubBuffer:
                if (Body.Length > GZipHeaderSize + 256)
                {
                    SubBuffer.PoolBufferFull compressBuffer = default(SubBuffer.PoolBufferFull);
                    SubArray <byte>          compressData   = new SubArray <byte>();
                    byte isCompress = 0;
                    try
                    {
#if DOTNET2 || DOTNET4
                        if (AutoCSer.IO.Compression.GzipCompressor.Get(Body.Array, Body.Start, Body.Length, ref compressBuffer, ref compressData, 0, GZipHeaderSize))
#else
                        if (AutoCSer.IO.Compression.GzipCompressor.Get(Body.Array, Body.Start, Body.Length, ref compressBuffer, ref compressData, 0, GZipHeaderSize, isFastestCompressionLevel))
#endif
                        {
                            isCompress = 1;
                            SubBuffer.Free();
                            Body = compressData;
                            if (compressData.Array == compressBuffer.Buffer)
                            {
                                SubBuffer = compressBuffer;
                            }
                            else
                            {
                                Type = ResponseType.SubByteArray;
                            }
                            ContentEncoding = GZipEncoding;
                            Flag           |= ResponseFlag.ContentEncoding;
                        }
                    }
                    finally
                    {
                        if (isCompress == 0 || Type != ResponseType.SubBuffer)
                        {
                            compressBuffer.Free();
                        }
                    }
                }
                return;
            }
        }