【问题标题】:ChunkedWriteHandler did not handle 100 Continue response properly to send all the chunksChunkedWriteHandler 未正确处理 100 继续响应以发送所有块
【发布时间】:2014-03-08 05:05:09
【问题描述】:

我使用 netty 4.0.9(或 12)HttpUploadClient 方式发送大型(>8K)发布请求。 但是,在第一个块发送到服务器后,服务器发回“100 continue”。 ChunkedWriteHandler 没有处理“100 Continue”来发送剩余的块。 相反,100 Continue 在无法处理的顶级处理程序的上游传递。 如何修改 ChunkedWriteHandler 来处理“100 Continue”响应 继续发送剩余的块以完成大的 post 请求?

【问题讨论】:

    标签: java netty nio


    【解决方案1】:

    ChunkedWriteHandler 是一个与协议无关的处理程序,因此您不应添加任何特定于 HTTP 的内容。

    相反,您可以更新管道中的最后一个处理程序,以便它理解 100-Continue 消息。在写入任何块之前,您最好先等待 100-Continue 响应。

    或者,您可以从请求中删除 Expect: 100-continue 标头,然后 HTTP 服务器将不会发送此类响应。

    【讨论】:

    • Trustin:感谢您的回复。
    • 感谢您的回复。该请求没有“期望:100-继续”,服务器发送了“100-继续”,我无法控制。还尝试了第二种方法: channel.writeAndFlush(request); // 仅标题部分。然后在handler之后收到100-Continue。 channel.writeAndFlush(requestEncoder); // 发送请求正文部分。但是,只发送了第一个块,而不是第二部分。那么知道如何调试这个吗?
    • 嗯,如果您可以编写一个简单的 HTTP 客户端和服务器代码来演示该问题而无需联系任何公共服务器,我将很乐意进一步调查。请随时提出问题。
    【解决方案2】:

    此错误已在 4.0.15 中针对 AbstractMemoryHttpData.java getChunk() 函数修复。

    异常是 AbstractByteBuf.java 中的 IllegalReferenceCountException。

    但是,在ChunkedWriteHandler.java doFlush()中,有catch(final Throwable t), 这可能会阻止任何未来的其他异常传播,除非明确检查它。

    【讨论】:

      猜你喜欢
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 2019-06-17
      • 1970-01-01
      相关资源
      最近更新 更多