【问题标题】:how to write response when it is not the lastchunk当它不是最后一个块时如何写响应
【发布时间】:2014-11-19 14:12:45
【问题描述】:

我正在运行 netty http 上传示例,并且有一个额外的要求,即在上传文件之前进行身份验证;我知道要上传大文件,我们使用分段模式上传,服务器端会多次读取 POST 请求。

所以我的想法是在请求体中设置token作为第一个参数,在读取chunk时我可以先验证token,如果不匹配则取消整个请求并返回一些状态码给客户端。

关键是如何取消请求并适当地发送状态码,我试过如下,但是当通道关闭时,客户端没有完成发送请求,并且会抛出“连接重置”异常:

ChannelFuture future = channel.writeAndFlush(response);
future.addListener(ChannelFutureListener.CLOSE);

如何在手动读取分块的帖子消息期间将响应发送回客户端。 在我的情况下,当块不是最后一个块时发送响应并关闭通道,客户端无法得到任何响应。

【问题讨论】:

    标签: netty


    【解决方案1】:

    我认为您的做法是正确的,但请注意,根据在收到完整请求之前回答时发现的以下项目是可能的,但大多数浏览器并不真正支持:

    Is it acceptable for a server to send a HTTP response before the entire request has been received?

    如果客户端是您自己的,您是否有任何日志显示在连接重置之前返回消息?您是否能够在第一条消息之前从服务器发送答案,在任何块之前(因此仅基于标头)(它可能会有所帮助)?

    【讨论】:

    • 感谢 Frederic 的快速回答,您的回答对我来说是退出帮助;是的,我尝试了最流行的浏览器,但 netty 客户端可以在抛出“连接重置”异常之前得到响应,猜测我必须自己处理这个,
    • 你也可以在服务器端快速消耗所有块直到最后一个,当你在标题部分发现它没有被处理时,只需抛出它们(所以根本没有多部分任务) .然后当最后一个块到达时,您将错误答案发回并关闭频道。
    • 再次感谢 Frederic,我试过了,但是文件太大了,需要很长时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多