我正在使用actix-web。我想限制post请求的大小,并让web应用程序捕获此错误,将其记录下来,并向用户发送回一条信息性错误消息。
我的代码如下所示。似乎无论是否超过限制,中间件都会运行,并且HTTP代码413被提升。仅当未超过限制时才执行accept_post。
有没有办法在中间件中捕获这个错误?
.service(
web::scope("/hello_someone4")
.service(
web::resource("/there/*")
.app_data(web::PayloadConfig::default().limit(16))
.wrap(simple_middleware::simple_middleware_say_hi::SayHi)
.route(web::post().to(request_handlers2::accept_post))
)
)发布于 2021-08-12 06:57:29
actix_web::middleware::errhandlers中间件提供了我正在寻找的解决方案。
下面的示例代码取自"https://actix.rs/docs/middleware/"。我现在可以向render_413函数添加代码(如下所示)来执行日志记录。
use actix_web::middleware::errhandlers::{ErrorHandlerResponse, ErrorHandlers};
use actix_web::{dev, http, HttpResponse, Result};
fn render_500<B>(mut res: actix_web::dev::ServiceResponse<B>) -> actix_web::Result<actix_web::middleware::errhandlers::ErrorHandlerResponse<B>> {
res.response_mut()
.headers_mut()
.insert(actix_web::http::header::CONTENT_TYPE, actix_web::http::HeaderValue::from_static("Error"));
Ok(actix_web::middleware::errhandlers::ErrorHandlerResponse::Response(res))
}
fn render_413<B>(mut res: actix_web::dev::ServiceResponse<B>) -> actix_web::Result<actix_web::middleware::errhandlers::ErrorHandlerResponse<B>> {
res.response_mut()
.headers_mut()
.insert(actix_web::http::header::CONTENT_TYPE, actix_web::http::HeaderValue::from_static("413 Error"));
let req = res.request();
let res = res.map_body(|_, _| actix_web::body::ResponseBody::Body(actix_web::dev::Body::from("{\"code\":413,\"error\":\"413 Payload Too Large\",\"message\":\"You've sent more data than expected\"}")).into_body());//alter the the response body see "https://users.rust-lang.org/t/actix-web-using-a-custom-error-handler-to-alter-the-response-body/41068"
Ok(actix_web::middleware::errhandlers::ErrorHandlerResponse::Response(res))
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
use actix_web::{web, App, HttpServer};
HttpServer::new(|| {
App::new()
.wrap(
actix_web::middleware::errhandlers::ErrorHandlers::new()
.handler(actix_web::http::StatusCode::INTERNAL_SERVER_ERROR, render_500),
)
.wrap(
actix_web::middleware::errhandlers::ErrorHandlers::new()
.handler(actix_web::http::StatusCode::PAYLOAD_TOO_LARGE, render_413),
)
)
.service(
web::resource("/test")
.route(web::get().to(|| HttpResponse::Ok()))
.route(web::head().to(|| HttpResponse::MethodNotAllowed())),
)
.service(
web::scope("/hello_someone4")
.service(
web::resource("/there/*")
.app_data(web::PayloadConfig::default().limit(16))
.wrap(simple_middleware::simple_middleware_say_hi::SayHi)
.route(web::post().to(request_handlers2::accept_post))
)
)
})
.bind("127.0.0.1:8080")?
.run()
.await
}https://stackoverflow.com/questions/68730867
复制相似问题