为 get 请求创建 warp 路径过滤器

Creating a warp path filter for get request

我是 Rust 初学者,我需要一些帮助来创建路径过滤器。精简代码如下所示:

pub fn requests_filter() -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
    let authenticate = warp::get()
            .and(warp::path("/auth")
            .and_then(perform_authentication);

    let get_request = warp::get()
        .and(
            warp::filters::query::raw()
            .or(warp::any().map(|| String::default()))
            .unify(),
        )
        .and(get_header)
        .and_then(process_get_request);

    authenticate.or(get_request)
}

我需要组合这两个过滤器,这样如果我收到一个授权请求 (/auth),那么它应该只执行第一个过滤器而不是第二个。对于所有其他 GET 请求,它应该只执行第二个路径过滤器。我在上面的代码中遇到的问题是在出现身份验证错误时执行第二个路径过滤器。我想让它 return 而不是执行第二个路径过滤器。你能告诉我如何解决这个问题吗?我查看了 routing.rs 示例,但无法弄清楚。提前致谢!

The issue I am having in the above code is the second path filter gets executed when there is some authentication error.

听起来 auth 正在 return 失败时 Rejection

遗憾的是,这是 warp 的一部分,非常令人困惑1:拒绝不是为了表达失败,它们是 warp 触发“回退”到下一个处理程序的机制在链中。因此,通过 return 拒绝,您告诉 warp 检查下一个处理程序是否可以接受请求。无论如何,这最终都会导致失败(如果 none 个处理程序可以做任何事情),但它也可以匹配 运行 任意数量的后续处理程序,具体取决于您的路由。

如果你想让 /auth 失败立即响应失败,你应该 return 一个 Ok(reply) 带有你想要的任何失败状态和负载(例如 403 或其他),不是 Err(failure) 表示此处理程序无法处理请求。


1:希望这会在 0.4 或 0.5 中发生变化,过滤器会为此获得更清晰的定制枚举,而不是覆盖 Result