Netty 没有传输编码分块的HTTP流中缺少EOF
我正在使用Netty 4通过HTTP传输内容。内容是动态生成的,因此无法提前知道内容长度。我现有的非netty代码写入一个Netty 没有传输编码分块的HTTP流中缺少EOF,netty,Netty,我正在使用Netty 4通过HTTP传输内容。内容是动态生成的,因此无法提前知道内容长度。我现有的非netty代码写入一个OutputStream,因此我在一个OutputStream周围编写了一个简单的包装器,它接受写入并将它们放入一个ByteBuf,当它满了时,它将其作为DefaultHttpContent的有效负载写入。在写入输出流之前,我会发送一个非完整的HttpResponsew/anOK状态代码 在流上调用close时,我发送本地ByteBuf中尚未发送的内容,然后LastHttpC
OutputStream
,因此我在一个OutputStream
周围编写了一个简单的包装器,它接受写入并将它们放入一个ByteBuf
,当它满了时,它将其作为DefaultHttpContent
的有效负载写入。在写入输出流之前,我会发送一个非完整的HttpResponse
w/anOK
状态代码
在流上调用close时,我发送本地ByteBuf中尚未发送的内容,然后LastHttpContent.EMPTY\u LAST\u CONTENT
我在wget中看到的是,它获取所有字节,然后坐在那里等待流的结束。如果我将Transfer-Encoding:Chunked头放在初始响应中,事情就会完美地工作
我可以在HttpObjectEncoder
中看到对最后一条httpcontent消息的处理上的一些差异,这就是我尝试分块传输头的原因。我不清楚的是区别是什么,以及为什么EOF似乎没有通过标头发送,即使发送了所有字节,并且我正在发送LastHttpContent.EMPTY\u LAST\u CONTENT
编辑:
我可以通过对Netty 4示例中的HttpStaticFileServerHandler
进行简单修改来重现这种行为。我正在使用将文件发送回客户端,(需要Guava)是我从HttpStaticFileServerHandler
修改的channelRead0
方法,它不是设置内容长度并将文件直接写入频道,它通过ByteBuffHttpOutStream
将文件复制到通道,该通道通过DefaultHttpContent
发送1 MB的输出块,并在close
上发送LastHttpContent.EMPTY\u LAST\u CONTENT
。如果我删除传输编码
头的设置:(response.headers().set(Names.Transfer\u Encoding,Values.CHUNKED)
),那么使用wget获取文件永远不会完成。afaict,我正确地发送了流,看起来HttpObjectEncoder
应该正确地处理LastHttpContent
,但是没有EOF。我认为这在master中已经修复,将成为4.0.9.Final的一部分
我认为您需要在编写最后一个HttpContent之后关闭频道,因为您没有设置任何内容长度。我怀疑这会起作用,但这不会完全阻止客户端请求保持活动连接吗?除非您指定内容长度并且不使用分块编码,知道内容结束的唯一方法是连接结束。所以保持活动状态和将内容流回到客户端是互斥的吗?