@@ -1,12 +1,12 @@
1−{-# LANGUAGE CPP #-}
1+{-# LANGUAGE CPP #-}
2−{-# LANGUAGE DefaultSignatures #-}
2+{-# LANGUAGE DefaultSignatures #-}
3−{-# LANGUAGE DeriveDataTypeable #-}
3+{-# LANGUAGE DeriveDataTypeable #-}
4−{-# LANGUAGE DeriveFunctor #-}
5−{-# LANGUAGE DeriveFoldable #-}
4+{-# LANGUAGE DeriveFoldable #-}
5+{-# LANGUAGE DeriveFunctor #-}
6−{-# LANGUAGE DeriveTraversable #-}
6+{-# LANGUAGE DeriveTraversable #-}
7−{-# LANGUAGE FlexibleInstances #-}
7+{-# LANGUAGE FlexibleInstances #-}
8−{-# LANGUAGE OverloadedStrings #-}
8+{-# LANGUAGE OverloadedStrings #-}
9−{-# LANGUAGE ScopedTypeVariables #-}
9+{-# LANGUAGE ScopedTypeVariables #-}
10{-# LANGUAGE TypeSynonymInstances #-}
10{-# LANGUAGE TypeSynonymInstances #-}
12-- Convert Haskell values to and from HTTP API data
12-- Convert Haskell values to and from HTTP API data
@@ -14,52 +14,56 @@
14module Web.Internal.HttpApiData where
14module Web.Internal.HttpApiData where
16#if __GLASGOW_HASKELL__ < 710
16#if __GLASGOW_HASKELL__ < 710
17−import Control.Applicative
17+import Control.Applicative
18−import Data.Foldable (Foldable)
18+import Data.Foldable (Foldable)
19−import Data.Traversable (Traversable(traverse))
19+import Data.Traversable (Traversable (traverse))
22−import Control.Arrow ((&&&), left)
22+import Control.Arrow (left, (&&&))
23−import Control.Monad ((<=<))
23+import Control.Monad ((<=<))
26−import Data.ByteString (ByteString)
25+import Data.ByteString (ByteString)
27−import qualified Data.ByteString as BS
26+import qualified Data.ByteString as BS
29−import Data.Int
29+import Data.Int
30−import Data.Word
30+import Data.Word
32−import Data.Text (Text)
32+import Data.Text (Text)
33+import qualified Data.Text as T
33−import Data.Text.Encoding (encodeUtf8, decodeUtf8')
34+import Data.Text.Encoding (decodeUtf8', encodeUtf8)
35+import qualified Data.Text.Lazy as L
34−import Data.Text.Read (signed, decimal, rational, Reader)
36+import Data.Text.Read (Reader, decimal, rational,
35−import qualified Data.Text as T
37+ signed)
36−import qualified Data.Text.Lazy as L
38−import Data.Time.Locale.Compat
40+import Data.Time.Locale.Compat
40−import Data.Version
41+import Data.Version
42#if MIN_VERSION_base(4,8,0)
43#if MIN_VERSION_base(4,8,0)
43−import Data.Void
44+import Data.Void
44−import Numeric.Natural
45+import Numeric.Natural
47−import Text.Read (readMaybe)
48−import Text.ParserCombinators.ReadP (readP_to_S)
48+import Text.ParserCombinators.ReadP (readP_to_S)
49+import Text.Read (readMaybe)
50#if USE_TEXT_SHOW
51#if USE_TEXT_SHOW
51−import TextShow (TextShow, showt)
52+import TextShow (TextShow, showt)
54−import qualified Data.UUID.Types as UUID
55+import qualified Data.UUID.Types as UUID
56−import Data.Typeable (Typeable)
57−import Data.Data (Data)
58−import qualified Data.ByteString.Builder as BS
57+import qualified Data.ByteString.Builder as BS
58+import Data.Data (Data)
59+import Data.Typeable (Typeable)
59−import qualified Network.HTTP.Types as H
60+import qualified Network.HTTP.Types as H
61−import qualified Data.Attoparsec.Text as Atto
62+import qualified Data.Attoparsec.Text as Atto
62−import qualified Data.Attoparsec.Time as Atto
63+import qualified Data.Attoparsec.Time as Atto
65+import Web.Cookie (SetCookie, parseSetCookie,
@@ -530,6 +534,14 @@ instance (ToHttpApiData a, ToHttpApiData b) => ToHttpApiData (Either a b) where
530 toUrlPiece (Left x) = "left " <> toUrlPiece x
534 toUrlPiece (Left x) = "left " <> toUrlPiece x
531 toUrlPiece (Right x) = "right " <> toUrlPiece x
535 toUrlPiece (Right x) = "right " <> toUrlPiece x
538+-- >>> let Right c = parseUrlPiece "SESSID=r2t5uvjq435r4q7ib3vtdjq120" :: Either Text SetCookie
540+-- "\"SESSID=r2t5uvjq435r4q7ib3vtdjq120\""
541+instance ToHttpApiData SetCookie where
542+ toUrlPiece = showt . BS.toLazyByteString . renderSetCookie
543+ toEncodedUrlPiece = renderSetCookie
534-- >>> parseUrlPiece "_" :: Either Text ()
546-- >>> parseUrlPiece "_" :: Either Text ()
535-- Right ()
547-- Right ()
@@ -664,6 +676,12 @@ instance FromHttpApiData a => FromHttpApiData (LenientData a) where
664 parseHeader = Right . LenientData . parseHeader
676 parseHeader = Right . LenientData . parseHeader
665 parseQueryParam = Right . LenientData . parseQueryParam
677 parseQueryParam = Right . LenientData . parseQueryParam
680+-- >>> parseUrlPiece "SESSID=r2t5uvjq435r4q7ib3vtdjq120" :: Either Text SetCookie
681+-- Right (SetCookie {setCookieName = "SESSID", setCookieValue = "r2t5uvjq435r4q7ib3vtdjq120", setCookiePath = Nothing, setCookieExpires = Nothing, setCookieMaxAge = Nothing, setCookieDomain = Nothing, setCookieHttpOnly = False, setCookieSecure = False, setCookieSameSite = Nothing})
682+instance FromHttpApiData SetCookie where
683+ parseUrlPiece = parseHeader . encodeUtf8
684+ parseHeader = Right . parseSetCookie
667-------------------------------------------------------------------------------
685-------------------------------------------------------------------------------
668-- Attoparsec helpers
686-- Attoparsec helpers
669-------------------------------------------------------------------------------
687-------------------------------------------------------------------------------