2016-10-03 3 views
1

J'utilise servant et Network.Wai.Application.Static respectivement pour json api et la diffusion de fichiers statiques. Je veux joindre ces deux Application tel que si staticApp ne parvient pas à servir, la demande devrait aller à jsonApp.Rejoindre deux Network.Wai.Application

J'ai essayé de trouver et de lire comment websocketsOr l'a fait. WebsocketsOr

J'ai finalement écrit:

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) 

Mais il semble que quelqu'un d'autre (lui-même WAI) aurait fait, le traitement de nombreux cas possibles .. Mais je ne suis pas en mesure de trouver.

Quels sont les bords des cas je suis manquant (exceptions ??) et quelle autre API puis-je utiliser pour faire la même chose?

Répondre

1

j'ai posé sur le canal #servant et alpounet m'a parlé de servant Raw qui permet de mettre notre propre gestionnaire Application. Ils ont même une serveDirectory api aussi bien :)

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