module Web.Apiary.Cookie.Internal where
import Network.Wai
import Web.Apiary
import Web.Cookie
import Data.Maybe
import Data.Proxy
import Data.Time
import Control.Monad.Apiary.Filter.Internal
import Control.Monad.Apiary.Filter.Internal.Strategy
import Blaze.ByteString.Builder
import qualified Data.ByteString as S
cond :: (a -> Bool) -> (a -> b) -> (a -> b) -> a -> b
cond p t f a = if p a then t a else f a
cookie :: (Strategy w, Query a)
=> S.ByteString
-> Proxy (w a)
-> Apiary (SNext w as a) b
-> Apiary as b
cookie k p = function $ \l r -> readStrategy (readQuery . Just) ((k ==) . fst) p (cookie' r) l
cookie' :: Request -> [(S.ByteString, S.ByteString)]
cookie' =
concatMap parseCookies .
mapMaybe (cond (("cookie" ==) . fst) (Just . snd) (const Nothing)) .
requestHeaders
deleteCookie :: S.ByteString -> Action ()
deleteCookie k = setCookie def { setCookieName = k
, setCookieExpires = Just $ UTCTime (ModifiedJulianDay 0) 0
, setCookieMaxAge = Just 0
}
setCookie :: SetCookie -> Action ()
setCookie =
addHeader "set-cookie" . toByteString . renderSetCookie