首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在没有错误的情况下尽早关闭大有效载荷(图像)请求的正确方法

在没有错误的情况下尽早关闭大有效载荷(图像)请求的正确方法
EN

Stack Overflow用户
提问于 2022-06-03 01:59:09
回答 1查看 114关注 0票数 0

最简单的http处理程序func,如

代码语言:javascript
代码运行次数:0
运行
复制
pub async fn new(mut payload: web::Payload) -> Result<impl Responder> {
    return Ok("ok");
}

将引发日志中的错误:

代码语言:javascript
代码运行次数:0
运行
复制
[2022-06-03T01:39:58Z DEBUG actix_http::h1::dispatcher] cannot read request payload
[2022-06-03T01:39:58Z DEBUG actix_http::h1::dispatcher] handler dropped payload early; attempt to clean connection
[2022-06-03T01:39:58Z ERROR actix_http::h1::dispatcher] handler did not read whole payload and dispatcher could not drain read buf; return 500 and close connection
[2022-06-03T01:39:58Z ERROR actix_http::h1::dispatcher] stream error: Handler dropped payload before reading EOF

似乎是因为我们没有消耗有效载荷。

有办法解决这个问题吗?

我真正想做的是像这样保护一个处理程序:

代码语言:javascript
代码运行次数:0
运行
复制
pub async fn new(user: User, mut payload: web::Payload) -> Result<impl Responder> {
    /*
      Do something with payload.
    */
}

当用户实现FromRequest特性时,它在其from_request函数中将返回用户或返回未经授权的错误。

因此,如果有未经授权的用户调用处理程序,它将提前返回ErrorUnauthorized。但这将适用于stream error: Handler dropped payload before reading EOF

EN

回答 1

Stack Overflow用户

发布于 2022-08-01 00:42:37

这听起来类似于:

https://github.com/actix/actix-web/issues/2695

在返回响应/错误之前,可能需要耗尽有效负载。你可以这样做:

代码语言:javascript
代码运行次数:0
运行
复制
payload.for_each(|_| ready(())).await;

代码语言:javascript
代码运行次数:0
运行
复制
while let Ok(Some(_)) = payload.try_next().await {}

我在处理多部分文件上传时遇到了类似的问题。但是,在大多数情况下,如选项一所述,耗尽有效负载在某些情况下是有效的,例如用户点击浏览器上的“停止”或“刷新”按钮,中断发生在流上循环时,读取有效负载块将出错“不完全”。试图将流转换为未来并在其上运行for_each()将无限期地挂起。备选案文二始终有效。

假设您的问题是相互关联的,希望它应该在v4.2中得到解决,尽管在像您这样处理有效负载时,您可能仍然需要对其进行一些内务处理。

就授权注释而言,您可以通过多种方式这样做。在中间件中有一种选择:

Rust Actix - early return from middleware

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72483998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档