module Hack.Frontend.MonadCGI ( cgiToApp ) where import Hack import Network.CGI.Monad import Network.CGI.Protocol import qualified Data.Map as Map import qualified Data.ByteString.Lazy as BS safeRead :: Read a => a -> String -> a safeRead d s = case reads s of ((x, _):_) -> x _ -> d cgiToApp :: CGI CGIResult -> Application cgiToApp cgi env = do let vars = http env input = hackInput env (inputs, body') = decodeInput vars input req = CGIRequest { cgiVars = Map.fromList vars , cgiInputs = inputs , cgiRequestBody = body' } (headers'', output') <- runCGIT cgi req let output = case output' of CGIOutput bs -> bs CGINothing -> BS.empty let headers' = map (\(HeaderName x, y) -> (x, y)) headers'' let status' = case lookup "Status" headers' of Nothing -> 200 Just s -> safeRead 200 s return $ Response status' headers' output