{-| Description: default warp server setup Provides a runner for a Warp server to run an app with some hopefully sensible middleware (such as request logging). -} module Web.Respond.DefaultServer where import Control.Applicative ((<$>)) import Network.Wai import qualified Network.Wai.Handler.Warp as Warp import qualified Network.Wai.Middleware.Gzip as Gzip import qualified Network.Wai.Middleware.RequestLogger as RequestLogger import qualified Data.Default.Class as Def import System.Log.FastLogger -- | sets up the app using 'prepApp' then uses 'Warp.run' to run it. runWaiApp :: Warp.Port -> LoggerSet -> Application -> IO () runWaiApp port logger app = prepApp logger app >>= Warp.run port -- | combines the application with the middleware created by -- 'mkMiddleware' prepApp :: LoggerSet -> Application -> IO Application prepApp logger app = ($ app) <$> mkMiddleware logger -- | combines gzip middleware and request logging middleware -- -- see 'Gzip.gzip'; uses the default values for it. -- -- the request logger is set up with the format 'RequestLogger.Apache' -- 'RequestLogger.FromSocket', and uses the 'LoggerSet' as the destination. -- see 'RequestLogger.mkRequestLogger'. mkMiddleware :: LoggerSet -> IO Middleware mkMiddleware logger = (. middlewares) <$> logMiddleware where middlewares = Gzip.gzip Def.def logMiddleware = RequestLogger.mkRequestLogger $ Def.def { RequestLogger.outputFormat = RequestLogger.Apache RequestLogger.FromSocket, RequestLogger.destination = RequestLogger.Logger logger }