正在为get请求创建扭曲路径筛选器



我是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请求(/auth(,它应该只执行第一个过滤器,而不是第二个。对于所有其他GET请求,它应该只执行第二个路径过滤器。我在上面的代码中遇到的问题是,当出现一些身份验证错误时,会执行第二个路径过滤器。我希望它返回而不执行第二个路径过滤器。你能告诉我怎么解决这个问题吗。我看了路由的例子,但没能弄清楚。提前感谢!

我在上面的代码中遇到的问题是,当出现一些身份验证错误时,会执行第二个路径过滤器。

听起来auth在失败时返回Rejection

可悲的是,这是warp的一个非常令人困惑的部分1:拒绝不是为了表达失败,而是warp触发"失败"的机制;回退";到链中的下一个处理程序。因此,通过返回拒绝,您可以告诉warp检查下一个处理程序是否可以接受该请求。无论如何,这最终都可能导致失败(如果没有一个处理程序可以做任何事情(,但它也可以根据您的路由匹配任何数量的后续处理程序。

如果您希望/auth故障立即以故障响应,则应返回一个具有您想要的任何故障状态和有效负载的Ok(reply)(例如403或其他(,而不是一个Err(failure),它将表示此处理程序无法处理请求。


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

最新更新