Search code examples
haskellservanthaskell-wai

Join two Network.Wai.Application


i am using servant and Network.Wai.Application.Static for json api and static file serving respectively. I want to join these two Application such that if staticApp fails to serve, request should go to jsonApp.

I tried finding out and read how websocketsOr has done it.WebsocketsOr

I finally wrote :

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)

But it seems like someone else (wai itself) would have done it, handling many possible cases.. But i am not able to find.

What are the edges cases i am missing (exceptions ?? ) and what other api can i use to do the same ?


Solution

  • I asked this on #servant channel and alpounet told me about servant Raw that allows to put our own Application handler. They even have a serveDirectory api as well :)

    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