cookie 0.3.0.2 → 0.4.0
raw patch · 2 files changed
+59/−7 lines, 2 filesdep +data-defaultPVP ok
version bump matches the API change (PVP)
Dependencies added: data-default
API changes (from Hackage documentation)
- Web.Cookie: SetCookie :: ByteString -> ByteString -> Maybe ByteString -> Maybe UTCTime -> Maybe ByteString -> Bool -> SetCookie
- Web.Cookie: instance Read SetCookie
+ Web.Cookie: def :: Default a => a
+ Web.Cookie: instance Default SetCookie
+ Web.Cookie: setCookieMaxAge :: SetCookie -> Maybe DiffTime
+ Web.Cookie: setCookieSecure :: SetCookie -> Bool
Files
- Web/Cookie.hs +57/−6
- cookie.cabal +2/−1
Web/Cookie.hs view
@@ -1,9 +1,20 @@ {-# LANGUAGE OverloadedStrings #-} module Web.Cookie ( -- * Server to client- SetCookie (..)+ -- ** Data type+ SetCookie+ , setCookieName+ , setCookieValue+ , setCookiePath+ , setCookieExpires+ , setCookieMaxAge+ , setCookieDomain+ , setCookieHttpOnly+ , setCookieSecure+ -- ** Functions , parseSetCookie , renderSetCookie+ , def -- * Client to server , Cookies , parseCookies@@ -25,7 +36,9 @@ import Blaze.ByteString.Builder.Char8 (fromChar) import Data.Monoid (mempty, mappend, mconcat) import Data.Word (Word8)+import Data.Ratio (numerator, denominator) import Data.Time (UTCTime, formatTime, parseTime)+import Data.Time.Clock (DiffTime, secondsToDiffTime) import System.Locale (defaultTimeLocale) import Control.Arrow (first) import Data.Text (Text)@@ -33,6 +46,7 @@ import Data.Text.Encoding.Error (lenientDecode) import Control.Arrow ((***)) import Data.Maybe (isJust)+import Data.Default (Default (def)) -- | Textual cookies. Functions assume UTF8 encoding. type CookiesText = [(Text, Text)]@@ -84,11 +98,25 @@ , setCookieValue :: S.ByteString , setCookiePath :: Maybe S.ByteString , setCookieExpires :: Maybe UTCTime+ , setCookieMaxAge :: Maybe DiffTime , setCookieDomain :: Maybe S.ByteString , setCookieHttpOnly :: Bool+ , setCookieSecure :: Bool }- deriving (Eq, Show, Read)+ deriving (Eq, Show) +instance Default SetCookie where+ def = SetCookie+ { setCookieName = "name"+ , setCookieValue = "value"+ , setCookiePath = Nothing+ , setCookieExpires = Nothing+ , setCookieMaxAge = Nothing+ , setCookieDomain = Nothing+ , setCookieHttpOnly = False+ , setCookieSecure = False+ }+ renderSetCookie :: SetCookie -> Builder renderSetCookie sc = mconcat [ fromByteString (setCookieName sc)@@ -96,19 +124,26 @@ , fromByteString (setCookieValue sc) , case setCookiePath sc of Nothing -> mempty- Just path -> copyByteString "; path="+ Just path -> copyByteString "; Path=" `mappend` fromByteString path , case setCookieExpires sc of Nothing -> mempty- Just e -> copyByteString "; expires=" `mappend`+ Just e -> copyByteString "; Expires=" `mappend` fromByteString (formatCookieExpires e)+ , case setCookieMaxAge sc of+ Nothing -> mempty+ Just ma -> copyByteString"; Max-Age=" `mappend`+ fromByteString (formatCookieMaxAge ma) , case setCookieDomain sc of Nothing -> mempty- Just d -> copyByteString "; domain=" `mappend`+ Just d -> copyByteString "; Domain=" `mappend` fromByteString d , if setCookieHttpOnly sc then copyByteString "; HttpOnly" else mempty+ , if setCookieSecure sc+ then copyByteString "; Secure"+ else mempty ] parseSetCookie :: S.ByteString -> SetCookie@@ -118,8 +153,11 @@ , setCookiePath = lookup "path" pairs , setCookieExpires = lookup "expires" pairs >>= parseCookieExpires+ , setCookieMaxAge =+ lookup "max-age" pairs >>= parseCookieMaxAge , setCookieDomain = lookup "domain" pairs- , setCookieHttpOnly = isJust $ lookup "HttpOnly" pairs+ , setCookieHttpOnly = isJust $ lookup "httponly" pairs+ , setCookieSecure = isJust $ lookup "secure" pairs } where (key, value, b) = parsePair a@@ -144,3 +182,16 @@ parseCookieExpires :: S.ByteString -> Maybe UTCTime parseCookieExpires = parseTime defaultTimeLocale expiresFormat . S8.unpack++-- | Format a 'DiffTime' for a cookie.+formatCookieMaxAge :: DiffTime -> S.ByteString+formatCookieMaxAge difftime = S8.pack $ show (num `div` denom)+ where rational = toRational difftime+ num = numerator rational+ denom = denominator rational++parseCookieMaxAge :: S.ByteString -> Maybe DiffTime+parseCookieMaxAge bs+ | all (\ c -> c >= '0' && c <= '9') $ unpacked = Just $ secondsToDiffTime $ read unpacked+ | otherwise = Nothing+ where unpacked = S8.unpack bs
cookie.cabal view
@@ -1,5 +1,5 @@ name: cookie-version: 0.3.0.2+version: 0.4.0 license: BSD3 license-file: LICENSE author: Michael Snoyman <michael@snoyman.com>@@ -18,6 +18,7 @@ , old-locale >= 1 && < 1.1 , time >= 1.1.4 , text >= 0.7 && < 1.0+ , data-default exposed-modules: Web.Cookie ghc-options: -Wall