respond-0.2.0.0: src/Web/Respond/DefaultServer.hs
{-|
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
}