cgi-utils 0.1 → 0.2
raw patch · 2 files changed
+16/−9 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Network.CGI.Session: instance MonadCGI SessionM
Files
- cgi-utils.cabal +3/−1
- src/Network/CGI/Session.hs +13/−8
cgi-utils.cabal view
@@ -1,5 +1,5 @@ Name: cgi-utils-Version: 0.1+Version: 0.2 Maintainer: Chris Done (chrisdone@gmail.com) Author: Chris Done (chrisdone@gmail.com) Copyright: 2010 Chris Done@@ -16,3 +16,5 @@ Exposed-Modules: Network.CGI.Session Hs-Source-Dirs: src Build-Depends: base >= 2 && < 4, cgi, random, containers, mtl+ Extensions: TypeSynonymInstances+ GHC-Options: -Wall
src/Network/CGI/Session.hs view
@@ -33,6 +33,7 @@ import System.IO (openBinaryFile,IOMode(ReadMode),hGetBuf,hClose) import System.Random (mkStdGen,StdGen,randomRs) import qualified Network.CGI as CGI+import Network.CGI.Monad (MonadCGI(cgiGet,cgiAddHeader)) -------------------------------------------------------------------------------- -- Section: Sessions implementation@@ -42,6 +43,10 @@ -- | A simple Session monad. Recommend you define your own. type SessionM = StateT Session (CGI.CGIT IO) +instance MonadCGI SessionM where+ cgiAddHeader = (lift .) . cgiAddHeader+ cgiGet = lift . cgiGet+ -- | Initialise a session state and start a F/CGI process. This is a -- bit of a pattern so I've included it here for convenience. runSessionCGI :: SessionName@@ -56,7 +61,7 @@ -- | Simple session runner. runSession :: Sessions -> SessionM a -> Session -> CGI.CGI a-runSession sessions = evalStateT+runSession _ = evalStateT -- | Session value getter. sessionGet :: Read a => String -> SessionM (Maybe a)@@ -115,15 +120,15 @@ initSession sessionName var = do s <- getSession sessionName var case s of- Just s -> return s+ Just s' -> return s' Nothing -> makeSession sessionName var -- | Create a new session and update the Mvar. makeSession :: SessionName -> Sessions -> CGI.CGI Session makeSession sessionName var = do- sess <- liftIO $ modifyMVar var $ \state@(id:ids,sessions) ->- let session = Session id M.empty- newState = (ids,M.insert id session sessions)+ sess <- liftIO $ modifyMVar var $ \(id':ids,sessions) ->+ let session = Session id' M.empty+ newState = (ids,M.insert id' session sessions) in return (newState,session) CGI.setCookie (CGI.newCookie sessionName $ show $ sess_id sess) { CGI.cookiePath = Just "/" }@@ -133,11 +138,11 @@ getSession :: SessionName -> Sessions -> CGI.CGI (Maybe Session) getSession sessionName var = do sId <- CGI.readCookie sessionName- (ids,sessions) <- liftIO $ readMVar var+ (_,sessions) <- liftIO $ readMVar var return $ sId >>= flip M.lookup sessions -- | Update a session in the map. updateSession :: Sessions -> Session -> CGI.CGI ()-updateSession var session@(Session id _) = do+updateSession var session@(Session id' _) = do liftIO $ modifyMVar_ var $ \(ids,sessions) -> do- return (ids,M.insert id session sessions)+ return (ids,M.insert id' session sessions)