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