加入两个 Network.Wai.Application

Join two Network.Wai.Application

我正在使用 servantNetwork.Wai.Application.Static 分别用于 json api 和静态文件服务。我想加入这两个 Application 这样如果 staticApp 服务失败,请求应该转到 jsonApp.

我试着找出并阅读 websocketsOr 是如何做到的。WebsocketsOr

我终于写了:

app :: NW.Application -> NW.Application -> NW.Application
app staticApp apiApp req respond =
  staticApp req (\ response ->
                  do
                    if (Status.statusCode . NW.responseStatus $ response) < 300
                    then respond response
                    else apiApp req respond)

但似乎其他人(wai 本身)会这样做,处理许多可能的情况。但我找不到。

我遗漏了哪些边缘情况(例外情况??)以及我可以使用哪些其他 api 来做同样的事情?

我在 #servant 频道上问过这个问题,alpounet 告诉我 servant Raw 允许放置我们自己的 Application 处理程序。他们甚至还有 serveDirectory api :)

import qualified Servant as S
import Servant ((:>), (:<|>))

type JobApi = "job" :> "status" :> S.Capture "id" ST.JobId :> S.Get '[S.JSON] ST.JobStatus
         :<|> "job" :> S.ReqBody '[S.JSON] ST.JobPostBody :> S.Post '[S.JSON] ST.JobId
         :<|> "job" :> S.Capture "id" ST.JobId :> S.Get '[S.JSON] ST.JobResult
         :<|> S.Raw

serverRouter :: ST.Server -> S.Server JobApi
serverRouter server = statusGet
    S.:<|> jobPost
    S.:<|> jobGet
    S.:<|> S.serveDirectory "assets"
  where 
    -- ... so on