首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rust actix-web捕获HTTP错误413 (HTTP/1.1 413有效负载太大)

Rust actix-web捕获HTTP错误413 (HTTP/1.1 413有效负载太大)
EN

Stack Overflow用户
提问于 2021-08-10 17:02:49
回答 1查看 223关注 0票数 1

我正在使用actix-web。我想限制post请求的大小,并让web应用程序捕获此错误,将其记录下来,并向用户发送回一条信息性错误消息。

我的代码如下所示。似乎无论是否超过限制,中间件都会运行,并且HTTP代码413被提升。仅当未超过限制时才执行accept_post。

有没有办法在中间件中捕获这个错误?

代码语言:javascript
复制
                .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))
                        )
                )
EN

回答 1

Stack Overflow用户

发布于 2021-08-12 06:57:29

actix_web::middleware::errhandlers中间件提供了我正在寻找的解决方案。

下面的示例代码取自"https://actix.rs/docs/middleware/"。我现在可以向render_413函数添加代码(如下所示)来执行日志记录。

代码语言:javascript
复制
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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68730867

复制
相关文章

相似问题

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