module Hope (hopeMain, runHopeWithSettings) where import Hope.DatabaseT (Database) import Hope.Module import Hope.Session import Hope.Setting import Hope.View import Hope.User.View import Hope.Util.CGI import Hope.Util.URI import Hope.Util.XHtml import Text.RSS (showXML, rssToXML) import Control.Monad.Error import Data.Maybe resourceOutput :: ResourceOutput -> Hope CGIResult resourceOutput (OutputHtml html) = do setHeader "Content-type" "text/html; charset=ISO-8859-1" output $ renderHtml html resourceOutput (OutputRSS rss) = do setHeader "Content-type" "application/rss+xml; charset=ISO-8859-1" output $ showXML $ rssToXML rss resourceOutput (OutputFile ct f) = do setHeader "Content-type" ct outputFile f resourceOutput (OutputRaw ct x) = do setHeader "Content-type" ct outputFPS x resourceOutput (RedirectURI uri) = do base <- baseURI redirect $ show $ uri `relativeTo'` base resourceOutput (Failure PermissionDenied) = permissionDeniedBox >>= outputBox "Permission denied" >>= resourceOutput resourceOutput (Failure (NotFound p)) = outputNotFound ("/" ++ showPath p) resourceOutput (Failure (MethodNotAllowed ms)) = outputMethodNotAllowed ms resourceOutput (Failure (InternalError msgs)) = outputInternalServerError msgs handleRequest :: [ResourceHandler] -> Path -> Method -> Hope ResourceOutput handleRequest [] p _ = notFound p handleRequest (f:fs) p m = f p m >>= maybe (handleRequest fs p m) return runHopeWithSettings :: Config -> Database -> Hope a -> CGI a runHopeWithSettings config db f = do settings <- loadSettings db let config' = config { configSettings = settings } runHope db config' f hopeMain :: Config -> Database -> CGI CGIResult hopeMain config db = runHopeWithSettings config db $ do getSessionSettings >>= loadSession path <- getPath method <- requestMethod rs <- liftM (map moduleResources) modules out <- handleRequest rs path method resourceOutput out