在netty 4.0.23中使用DefaultHttpContent而不是HttpResponse

时间:2015-10-27 16:36:51

标签: netty

我有一个Http客户端的以下管道配置 -

pipeline.addLast("ssl", new SslHandler());      
pipeline.addLast("decoder", new HttpResponseDecoder());     
pipeline.addLast("encoder", new HttpRequestEncoder());
pipeline.addLast("handler", new MySimpleChannelInboundHandler());

MySimpleChannelInboundHandler的{​​{1}}方法中,我得到channelRead0()而不是DefaultHttpContent的实例。当我使用 -

记录HttpResponse的内容时
DefaultHttpContent

我可以看到记录的实际HTTP响应。

为什么即使我在管道中有HTTP解码器,这个HTTP响应也没有被解码为DefaultHttpContent content = (DefaultHttpContent) msg; LOG.debug(content.content().toString(CharsetUtil.UTF_8)); 对象?

谢谢!

2 个答案:

答案 0 :(得分:0)

在enc / decoders之前使用HttpObjectAggregator以聚合httpResponse和所有以下HttpContents。在管道中添加HttpObjectAggregator后,您将在处理程序中获得FullHttpResponse个对象。

例如:p.addLast("aggregator", new HttpObjectAggregator(1048576));

还有一件事,如果你没有为客户实现自己的编码/解码器,你可以提供netty的HttpClientCodec

答案 1 :(得分:0)

我遇到了问题。 HttpResponseDecoder之前已解码对HTTP CONNECT请求的响应。我没有覆盖isContentAlwaysEmpty(HttpMessage httpMessage)方法为CONNECT请求返回false。这使HttpResponseDecoder处于不良状态。它期待响应中的内容,但对HTTP CONNECT的响应没有。当对下一个请求的响应到达时,它被视为内容而未被解码为HttpResponse

我扩展HttpResponseDecoder并覆盖(覆盖?)isContentAlwaysEmpty(HttpMessage httpMessage)以返回false以获取CONNECT请求并且它有效。这已记录在HttpResponseDecoder class level documentation下的"解码CONNECT请求的响应"。