我使用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。