0

我正在使用 Netty 4 通过 HTTP 流式传输内容。内容是动态生成的,因此无法提前知道内容长度。我现有的非 netty 代码写入 an OutputStream,所以我在 an 周围编写了一个简单的包装器,OutputStream它接受写入并将它们放入 aByteBuf中,当它已满时,它将它写为DefaultHttpContent. 在对 进行任何写入之前,我会发送一个带有状态码OutputStream的非完整信息。HttpResponseOK

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

我用 wget 看到的是它获取所有字节,然后坐下来等待流的结束。如果我将 Transfer-Encoding: Chunked 标头放在初始响应中,则一切正常。

我可以看到处理 LastHttpContent 消息的一些差异,HttpObjectEncoder这是我尝试分块传输标头的线索。我不清楚的是有什么区别以及为什么 EOF 似乎没有在没有标头的情况下发送,即使所有字节都已发送并且我正在发送LastHttpContent.EMPTY_LAST_CONTENT

编辑:

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

4

1 回答 1

0

我认为这只是在 master 中修复的,将成为 4.0.9.Final 的一部分

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

于 2013-09-06T07:45:48.800 回答