cookie 0.1.0 → 0.2.0
raw patch · 2 files changed
+37/−40 lines, 2 filesdep −asciidep ~blaze-builderPVP ok
version bump matches the API change (PVP)
Dependencies removed: ascii
Dependency ranges changed: blaze-builder
API changes (from Hackage documentation)
- Web.Cookie: SetCookie :: Ascii -> Ascii -> Maybe Ascii -> Maybe UTCTime -> Maybe Ascii -> SetCookie
+ Web.Cookie: SetCookie :: ByteString -> ByteString -> Maybe ByteString -> Maybe UTCTime -> Maybe ByteString -> SetCookie
- Web.Cookie: formatCookieExpires :: UTCTime -> Ascii
+ Web.Cookie: formatCookieExpires :: UTCTime -> ByteString
- Web.Cookie: parseCookieExpires :: Ascii -> Maybe UTCTime
+ Web.Cookie: parseCookieExpires :: ByteString -> Maybe UTCTime
- Web.Cookie: parseCookies :: Ascii -> Cookies
+ Web.Cookie: parseCookies :: ByteString -> Cookies
- Web.Cookie: parseSetCookie :: Ascii -> SetCookie
+ Web.Cookie: parseSetCookie :: ByteString -> SetCookie
- Web.Cookie: renderCookies :: Cookies -> AsciiBuilder
+ Web.Cookie: renderCookies :: Cookies -> Builder
- Web.Cookie: renderSetCookie :: SetCookie -> AsciiBuilder
+ Web.Cookie: renderSetCookie :: SetCookie -> Builder
- Web.Cookie: setCookieDomain :: SetCookie -> Maybe Ascii
+ Web.Cookie: setCookieDomain :: SetCookie -> Maybe ByteString
- Web.Cookie: setCookieName :: SetCookie -> Ascii
+ Web.Cookie: setCookieName :: SetCookie -> ByteString
- Web.Cookie: setCookiePath :: SetCookie -> Maybe Ascii
+ Web.Cookie: setCookiePath :: SetCookie -> Maybe ByteString
- Web.Cookie: setCookieValue :: SetCookie -> Ascii
+ Web.Cookie: setCookieValue :: SetCookie -> ByteString
- Web.Cookie: type Cookies = [(Ascii, Ascii)]
+ Web.Cookie: type Cookies = [(ByteString, ByteString)]
Files
- Web/Cookie.hs +35/−37
- cookie.cabal +2/−3
Web/Cookie.hs view
@@ -15,19 +15,21 @@ ) where import qualified Data.ByteString as S+import qualified Data.ByteString.Char8 as S8+import Data.Char (toLower)+import Blaze.ByteString.Builder (Builder, fromByteString, copyByteString) import Blaze.ByteString.Builder.Char8 (fromChar) import Data.Monoid (mempty, mappend, mconcat) import Data.Word (Word8) import Data.Time (UTCTime, formatTime, parseTime) import System.Locale (defaultTimeLocale) import Control.Arrow (first)-import qualified Data.Ascii as A -type Cookies = [(A.Ascii, A.Ascii)]+type Cookies = [(S.ByteString, S.ByteString)] -- | Decode the value of a \"Cookie\" request header into key/value pairs.-parseCookies :: A.Ascii -> Cookies-parseCookies = parseCookiesBS . A.toByteString+parseCookies :: S.ByteString -> Cookies+parseCookies = parseCookiesBS parseCookiesBS :: S.ByteString -> Cookies parseCookiesBS s@@ -36,59 +38,57 @@ let (x, y) = breakDiscard 59 s -- semicolon in parseCookie x : parseCookiesBS y -parseCookie :: S.ByteString -> (A.Ascii, A.Ascii)+parseCookie :: S.ByteString -> (S.ByteString, S.ByteString) parseCookie s = let (key, value) = breakDiscard 61 s -- equals sign key' = S.dropWhile (== 32) key -- space- in (A.unsafeFromByteString key', A.unsafeFromByteString value)+ in (key', value) breakDiscard :: Word8 -> S.ByteString -> (S.ByteString, S.ByteString) breakDiscard w s = let (x, y) = S.breakByte w s in (x, S.drop 1 y) -renderCookies :: Cookies -> A.AsciiBuilder+renderCookies :: Cookies -> Builder renderCookies [] = mempty renderCookies cs = foldr1 go $ map renderCookie cs where- go x y = x `mappend` A.unsafeFromBuilder (fromChar ';') `mappend` y+ go x y = x `mappend` fromChar ';' `mappend` y -renderCookie :: (A.Ascii, A.Ascii) -> A.AsciiBuilder-renderCookie (k, v) =- A.toAsciiBuilder k `mappend`- A.unsafeFromBuilder (fromChar '=') `mappend`- A.toAsciiBuilder v+renderCookie :: (S.ByteString, S.ByteString) -> Builder+renderCookie (k, v) = fromByteString k `mappend` fromChar '='+ `mappend` fromByteString v data SetCookie = SetCookie- { setCookieName :: A.Ascii- , setCookieValue :: A.Ascii- , setCookiePath :: Maybe A.Ascii+ { setCookieName :: S.ByteString+ , setCookieValue :: S.ByteString+ , setCookiePath :: Maybe S.ByteString , setCookieExpires :: Maybe UTCTime- , setCookieDomain :: Maybe A.Ascii+ , setCookieDomain :: Maybe S.ByteString } deriving (Eq, Show, Read) -renderSetCookie :: SetCookie -> A.AsciiBuilder+renderSetCookie :: SetCookie -> Builder renderSetCookie sc = mconcat- [ A.toAsciiBuilder $ setCookieName sc- , A.unsafeFromBuilder $ fromChar '='- , A.toAsciiBuilder $ setCookieValue sc+ [ fromByteString (setCookieName sc)+ , fromChar '='+ , fromByteString (setCookieValue sc) , case setCookiePath sc of Nothing -> mempty- Just path -> A.toAsciiBuilder "; path="- `mappend` A.toAsciiBuilder path+ Just path -> copyByteString "; path="+ `mappend` fromByteString path , case setCookieExpires sc of Nothing -> mempty- Just e -> A.toAsciiBuilder "; expires=" `mappend`- A.toAsciiBuilder (formatCookieExpires e)+ Just e -> copyByteString "; expires=" `mappend`+ fromByteString (formatCookieExpires e) , case setCookieDomain sc of Nothing -> mempty- Just d -> A.toAsciiBuilder "; domain=" `mappend`- A.toAsciiBuilder d+ Just d -> copyByteString "; domain=" `mappend`+ fromByteString d ] -parseSetCookie :: A.Ascii -> SetCookie+parseSetCookie :: S.ByteString -> SetCookie parseSetCookie a = SetCookie { setCookieName = key , setCookieValue = value@@ -98,14 +98,12 @@ , setCookieDomain = lookup "domain" pairs } where- (key, value, b) = parsePair $ A.toByteString a- pairs = map (first $ A.toCIAscii) $ parsePairs b+ (key, value, b) = parsePair a+ pairs = map (first $ S8.map toLower) $ parsePairs b parsePair bs = let (k, bs') = breakDiscard 61 bs -- equals sign (v, bs'') = breakDiscard 59 bs' -- semicolon- in (A.unsafeFromByteString k,- A.unsafeFromByteString v,- S.dropWhile (== 32) bs'') -- space+ in (k, v, S.dropWhile (== 32) bs'') -- space parsePairs bs = if S.null bs then []@@ -116,9 +114,9 @@ expiresFormat = "%a, %d-%b-%Y %X GMT" -- | Format a 'UTCTime' for a cookie.-formatCookieExpires :: UTCTime -> A.Ascii+formatCookieExpires :: UTCTime -> S.ByteString formatCookieExpires =- A.unsafeFromString . formatTime defaultTimeLocale expiresFormat+ S8.pack . formatTime defaultTimeLocale expiresFormat -parseCookieExpires :: A.Ascii -> Maybe UTCTime-parseCookieExpires = parseTime defaultTimeLocale expiresFormat . A.toString+parseCookieExpires :: S.ByteString -> Maybe UTCTime+parseCookieExpires = parseTime defaultTimeLocale expiresFormat . S8.unpack
cookie.cabal view
@@ -1,5 +1,5 @@ name: cookie-version: 0.1.0+version: 0.2.0 license: BSD3 license-file: LICENSE author: Michael Snoyman <michael@snoyman.com>@@ -14,10 +14,9 @@ library build-depends: base >= 4 && < 5 , bytestring >= 0.9.1.4 && < 0.10- , blaze-builder >= 0.2.1 && < 0.3+ , blaze-builder >= 0.2.1 && < 0.4 , old-locale >= 1 && < 1.1 , time >= 1.1.4 && < 1.3- , ascii >= 0.0.2 && < 0.1 exposed-modules: Web.Cookie ghc-options: -Wall