1

我正在编写一个 Suave 应用程序,如果源 IP 不在该路由的授权列表中,我想停止。为此,我编写了一个小过滤器:

let RemoteIp (ipList: System.Net.IPAddress List) (x: Http.HttpContext) = 
    if (ipList |> List.map (fun ip -> x.clientIpTrustProxy.Equals ip ) |> List.contains true)
    then
        async.Return (Some x)
    else
        async.Return None

然后我适应了

        Filters.path "/cache" >=> RemoteIp authorizedIps >=> Filters.GET >=> Successful.OK ""

所以只有当它来自我授权列表中的 IP 时,我才能处理呼叫,如果不​​是,它只会继续。但是我真正想做的是返回 403。现在我只是短路了路线搜索。

有没有类似分支组合器的东西?

4

1 回答 1

2

我结束了编写一个分支函数:

let Branch (x:WebPart) (y:WebPart) (z:WebPart): WebPart =
fun arg -> async {
   let! res = x arg 
   match res with
   | Some v -> return! y arg
   | None -> return! z arg
}

所以现在我有类似的东西

Filters.path "/cache" >=> Branch (RemoteIp authorizedIps) (Successful.OK "Yea!") (RequestErrors.FORBIDDEN "Nope")

有时它可能会派上用场,但实际上,我之前应该想到的是 Fyodor 的建议,我认为它更具可读性:

        Filters.path "/cache" >=> choose [
           RemoteIp authorizedIps >=> Successful.OK "Yea!"
           RequestErrors.FORBIDDEN "Nope"
        ]
于 2018-02-24T18:12:06.990 回答