예제 #1
0
        protected override Result BeginEncode(IHttpResponse httpResponse, ICharSequence acceptEncoding)
        {
            if (this.contentSizeThreshold > 0)
            {
                if (httpResponse is IHttpContent httpContent &&
                    httpContent.Content.ReadableBytes < this.contentSizeThreshold)
                {
                    return(null);
                }
            }

            if (httpResponse.Headers.Contains(HttpHeaderNames.ContentEncoding))
            {
                // Content-Encoding was set, either as something specific or as the IDENTITY encoding
                // Therefore, we should NOT encode here
                return(null);
            }

            ZlibWrapper?wrapper = this.DetermineWrapper(acceptEncoding);

            if (wrapper is null)
            {
                return(null);
            }

            ICharSequence targetContentEncoding = null;

            switch (wrapper.Value)
            {
            case ZlibWrapper.Gzip:
                targetContentEncoding = GZipString;
                break;

            case ZlibWrapper.Zlib:
                targetContentEncoding = DeflateString;
                break;

            default:
                ThrowHelper.ThrowCodecException_InvalidCompression(wrapper.Value); break;
            }

            return(new Result(targetContentEncoding,
                              new EmbeddedChannel(
                                  this.handlerContext.Channel.Id,
                                  this.handlerContext.Channel.Metadata.HasDisconnect,
                                  this.handlerContext.Channel.Configuration,
                                  ZlibCodecFactory.NewZlibEncoder(
                                      wrapper.Value, this.compressionLevel, this.windowBits, this.memLevel))));
        }