Netty HttpStaticFileServer示例不使用HttpContentCompressor

时间:2013-11-22 03:12:18

标签: java netty

如果我将以下行添加到HttpStaticFileServerInitializer

pipeline.addLast("decoder", new HttpRequestDecoder());
pipeline.addLast("aggregator", new HttpObjectAggregator(65536));
pipeline.addLast("encoder", new HttpResponseEncoder());
pipeline.addLast("chunkedWriter", new ChunkedWriteHandler());
pipeline.addLast("deflater", new HttpContentCompressor());  // Added

文件随Content-Encoding: gzip一起提供,但内容实际上并未进行gzip压缩。这会导致大多数浏览器无法解码内容。

DefaultFileRegion不能与HttpContentCompressor一起使用,或者还有其他必须做的事情让他们一起工作吗?

3 个答案:

答案 0 :(得分:3)

您可以获得分块传输(ChunkedWriteHandler)和HttpContentCompressor一起工作。您只需提供一个ChunkedInput来生成 HttpContent 对象,而不是 ByteBuf 对象。

这是一个快速的写作: http://andreas.haufler.info/2014/01/making-http-content-compression-work-in.html

答案 1 :(得分:0)

不幸的是,分块传输和gzip内容编码是一个困难的组合。压缩不能在块级别上进行,而是在整个内容上进行(使得实时数据不可能)。因此,您需要自己压缩内容然后传输它。在您的示例中,这意味着您不能组合使用块编写器和内容压缩器。

答案 2 :(得分:0)

根据Clement的评论和随后在 #netty 中的讨论,听起来好像不可能一起使用DefaultFileRegionHttpContentCompressor。我切换回ChunkedFile,它运行正常。

    RandomAccessFile raf = new RandomAccessFile(file, "r");
    if (request.method() != HttpMethod.HEAD) {
        ctx.write(new ChunkedFile(raf, 0, fileLength, 8192));
    }

我还对HttpContentCompressor进行了子类化,并对内容类型进行了一些检查,以确定文件是否应该被压缩(JPEG,PNG和其他二进制文件跳过压缩步骤。)