最简单的http处理程序func,如
pub async fn new(mut payload: web::Payload) -> Result<impl Responder> {
return Ok("ok");
}
将引发日志中的错误:
[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
似乎是因为我们没有消耗有效载荷。
有办法解决这个问题吗?
我真正想做的是像这样保护一个处理程序:
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
。
发布于 2022-07-31 16:42:37
这听起来类似于:
https://github.com/actix/actix-web/issues/2695
在返回响应/错误之前,可能需要耗尽有效负载。你可以这样做:
payload.for_each(|_| ready(())).await;
或
while let Ok(Some(_)) = payload.try_next().await {}
我在处理多部分文件上传时遇到了类似的问题。但是,在大多数情况下,如选项一所述,耗尽有效负载在某些情况下是有效的,例如用户点击浏览器上的“停止”或“刷新”按钮,中断发生在流上循环时,读取有效负载块将出错“不完全”。试图将流转换为未来并在其上运行for_each()
将无限期地挂起。备选案文二始终有效。
假设您的问题是相互关联的,希望它应该在v4.2中得到解决,尽管在像您这样处理有效负载时,您可能仍然需要对其进行一些内务处理。
就授权注释而言,您可以通过多种方式这样做。在中间件中有一种选择:
https://stackoverflow.com/questions/72483998
复制