Merge pull request #1099 from DaveCTurner/issue-1099

Have clientSessionDateCacher use auto-update
This commit is contained in:
Felipe Lessa 2015-11-13 13:49:45 -02:00
commit 5e2fa9af82

View File

@ -16,6 +16,7 @@ import Control.Monad (forever, guard)
import Yesod.Core.Types import Yesod.Core.Types
import Yesod.Core.Internal.Util import Yesod.Core.Internal.Util
import qualified Data.IORef as I import qualified Data.IORef as I
import Control.AutoUpdate
encodeClientSession :: CS.Key encodeClientSession :: CS.Key
-> CS.IV -> CS.IV
@ -44,25 +45,28 @@ decodeClientSession key date rhost encrypted = do
---------------------------------------------------------------------- ----------------------------------------------------------------------
-- Mostly copied from Kazu's date-cache, but with modifications -- Originally copied from Kazu's date-cache, but now using mkAutoUpdate.
-- that better suit our needs.
-- --
-- The cached date is updated every 10s, we don't need second -- The cached date is updated every 10s, we don't need second
-- resolution for session expiration times. -- resolution for session expiration times.
--
-- The second component of the returned tuple used to be an action that
-- killed the updater thread, but is now a no-op that's just there
-- to preserve the type.
clientSessionDateCacher :: clientSessionDateCacher ::
NominalDiffTime -- ^ Inactive session valitity. NominalDiffTime -- ^ Inactive session valitity.
-> IO (IO ClientSessionDateCache, IO ()) -> IO (IO ClientSessionDateCache, IO ())
clientSessionDateCacher validity = do clientSessionDateCacher validity = do
ref <- getUpdated >>= I.newIORef getClientSessionDateCache <- mkAutoUpdate defaultUpdateSettings
tid <- forkIO $ forever (doUpdate ref) { updateAction = getUpdated
return $! (I.readIORef ref, killThread tid) , updateFreq = 10000000 -- 10s
}
return $! (getClientSessionDateCache, return ())
where where
getUpdated = do getUpdated = do
now <- getCurrentTime now <- getCurrentTime
let expires = validity `addUTCTime` now let expires = validity `addUTCTime` now
expiresS = runPut (putTime expires) expiresS = runPut (putTime expires)
return $! ClientSessionDateCache now expires expiresS return $! ClientSessionDateCache now expires expiresS
doUpdate ref = do
threadDelay 10000000 -- 10s
I.writeIORef ref =<< getUpdated