module Web.Wheb.Cookie
( setCookie
, setCookie'
, getCookie
, getCookies
, removeCookie
) where
import qualified Blaze.ByteString.Builder as B (toByteString)
import Data.Maybe (fromMaybe)
import Data.Text.Lazy (Text)
import qualified Data.Text.Lazy as T (empty, fromStrict, toStrict)
import Data.Time.Calendar (Day(ModifiedJulianDay))
import Data.Time.Clock (secondsToDiffTime, UTCTime(UTCTime))
import Web.Cookie (CookiesText, def, parseCookiesText, renderSetCookie,
SetCookie(setCookieExpires, setCookieName, setCookieValue))
import Web.Wheb.Types (WhebT)
import Web.Wheb.Utils (lazyTextToSBS)
import Web.Wheb.WhebT (getRequestHeader, setRawHeader)
getDefaultCookie :: Monad m => WhebT g s m SetCookie
getDefaultCookie = return def
setCookie :: Monad m => Text -> Text -> WhebT g s m ()
setCookie k v = getDefaultCookie >>= (setCookie' k v)
setCookie' :: Monad m => Text -> Text -> SetCookie -> WhebT g s m ()
setCookie' k v sc = setRawHeader ("Set-Cookie", cookieText)
where cookie = sc { setCookieName = lazyTextToSBS k
, setCookieValue = lazyTextToSBS v
}
cookieText = B.toByteString $ renderSetCookie cookie
getCookies :: Monad m => WhebT g s m CookiesText
getCookies = (getRequestHeader "Cookie") >>=
(return . parseFunc . (fromMaybe T.empty))
where parseFunc = parseCookiesText . lazyTextToSBS
getCookie :: Monad m => Text -> WhebT g s m (Maybe Text)
getCookie k = getCookies >>=
(return . (fmap T.fromStrict) . (lookup (T.toStrict k)))
removeCookie :: Monad m => Text -> WhebT g s m ()
removeCookie k = do
defCookie <- getDefaultCookie
let utcLongAgo = UTCTime (ModifiedJulianDay 0) (secondsToDiffTime 0)
expiredCookie = defCookie {setCookieExpires = Just utcLongAgo}
setCookie' k T.empty expiredCookie