没有传输编码的HTTP流中缺少EOF

时间:2013-09-05 18:05:21

标签: netty

我使用Netty 4通过HTTP传输内容。内容是动态生成的,因此无法提前知道内容长度。我现有的非netty代码写入OutputStream,所以我在OutputStream周围编写了一个简单的包装器,它接受写入并将它们放在ByteBuf中,当它完整时,它写入它作为DefaultHttpContent的有效载荷。在对OutputStream进行任何写操作之前,我会发送一个非完整HttpResponse w /和OK状态代码。

当在流上调用close时,我发送尚未发送的本地ByteBuf中的任何内容,然后LastHttpContent.EMPTY_LAST_CONTENT

我在wget中看到的是它获取所有字节,但随后坐下并等待流的结束。如果我在初始响应中放置Transfer-Encoding:Chunked标头,那么事情就完美无缺。

我可以看到HttpObjectEncoder中处理LastHttpContent消息的一些差异,这是我尝试分块传输头的原因。我不清楚的是,差异是什么以及为什么EOF似乎不会被发送到标题,即使所有字节都发送我发送LastHttpContent.EMPTY_LAST_CONTENT

修改

我可以通过对Netty 4示例中HttpStaticFileServerHandler的简单修改来重现此行为。我使用this class将文件发送回客户端,this(需要Guava)是我channelRead0修改后的HttpStaticFileServerHandler方法,而不是设置内容长度&将文件直接写入频道,它会通过ByteBuffHttpOutputStream将文件复制到频道,DefaultHttpContent通过close发送1 MB的输出,然后LastHttpContent.EMPTY_LAST_CONTENT发送Transfer-Encoding。如果我删除了response.headers().set(Names.TRANSFER_ENCODING, Values.CHUNKED)标题的设置:(HttpObjectEncoder),那么使用wget抓取文件永远不会完成。 afaict,我正在正确地发送流,而看起来就像LastHttpContent应正确处理{{1}},但是没有EOF。

1 个答案:

答案 0 :(得分:0)

我认为这只是在master中修复,并且将成为4.0.9.Final

的一部分

https://github.com/netty/netty/pull/1787