{-# LANGUAGE NoImplicitPrelude #-} module RFC.Wai ( defaultMiddleware ) where import Network.HTTP.Types.Header import Network.HTTP.Types.Method import Network.Wai import Network.Wai.Middleware.AcceptOverride import Network.Wai.Middleware.Approot (envFallback) import Network.Wai.Middleware.Autohead import Network.Wai.Middleware.Cors import Network.Wai.Middleware.Gzip import Network.Wai.Middleware.Jsonp import Network.Wai.Middleware.MethodOverridePost import Network.Wai.Middleware.RequestLogger (logStdout, logStdoutDev) import RFC.Env (isDevelopment) import RFC.Prelude import System.IO.Temp (createTempDirectory, getCanonicalTemporaryDirectory) defaultMiddleware :: IO Middleware defaultMiddleware = do isDev <- isDevelopment approot <- envFallback tmpDir <- getCanonicalTemporaryDirectory gzipDir <- createTempDirectory tmpDir "wai-gzip-middleware" return $ methodOverridePost . acceptOverride . (cors $ const $ Just corsConfig). autohead . jsonp . approot . gzip (gzipConfig gzipDir) . (if isDev then logStdoutDev else logStdout) where corsConfig = simpleCorsResourcePolicy { corsRequireOrigin = False , corsVaryOrigin = False , corsMaxAge = Nothing , corsRequestHeaders = hContentType : simpleHeaders , corsMethods = [ methodGet , methodPost , methodHead , methodDelete , methodPatch , methodOptions , methodPut ] } gzipConfig gzipDir = def { gzipFiles = GzipCacheFolder gzipDir , gzipCheckMime = const True }