@@ -24,6 +24,7 @@ import Control.Monad ((<=<))
2424
2525import Data.ByteString (ByteString)
2626import qualified Data.ByteString as BS
27+import qualified Data.ByteString.Lazy as LBS
2728import Data.Monoid
2829
2930import qualified Data.Fixed as F
@@ -32,7 +33,8 @@ import Data.Word
3233
3334import Data.Text (Text)
3435import qualified Data.Text as T
35−import Data.Text.Encoding (decodeUtf8', encodeUtf8)
36+import Data.Text.Encoding (decodeUtf8With, decodeUtf8', encodeUtf8)
37+import Data.Text.Encoding.Error (lenientDecode)
3638import qualified Data.Text.Lazy as L
3739import Data.Text.Read (Reader, decimal, rational,
3840 signed)
@@ -539,13 +541,19 @@ instance (ToHttpApiData a, ToHttpApiData b) => ToHttpApiData (Either a b) where
539541 toUrlPiece (Left x) = "left " <> toUrlPiece x
540542 toUrlPiece (Right x) = "right " <> toUrlPiece x
541543
542−-- |
544+-- | /Note:/ this instance works correctly for alphanumeric name and value
545+--
543546-- >>> let Right c = parseUrlPiece "SESSID=r2t5uvjq435r4q7ib3vtdjq120" :: Either Text SetCookie
544547-- >>> toUrlPiece c
545−-- "\"SESSID=r2t5uvjq435r4q7ib3vtdjq120\""
548+-- "SESSID=r2t5uvjq435r4q7ib3vtdjq120"
549+--
550+-- >>> toHeader c
551+-- "SESSID=r2t5uvjq435r4q7ib3vtdjq120"
552+--
546553instance ToHttpApiData SetCookie where
547− toUrlPiece = showt . BS.toLazyByteString . renderSetCookie
548− toEncodedUrlPiece = renderSetCookie
554+ toUrlPiece = decodeUtf8With lenientDecode . toHeader
555+ toHeader = LBS.toStrict . BS.toLazyByteString . renderSetCookie
556+ -- toEncodedUrlPiece = renderSetCookie -- doesn't do things.
549557
550558-- |
551559-- >>> parseUrlPiece "_" :: Either Text ()
@@ -681,12 +689,14 @@ instance FromHttpApiData a => FromHttpApiData (LenientData a) where
681689 parseHeader = Right . LenientData . parseHeader
682690 parseQueryParam = Right . LenientData . parseQueryParam
683691
684−-- |
692+-- | /Note:/ this instance works correctly for alphanumeric name and value
693+--
685694-- >>> parseUrlPiece "SESSID=r2t5uvjq435r4q7ib3vtdjq120" :: Either Text SetCookie
686695-- Right (SetCookie {setCookieName = "SESSID", setCookieValue = "r2t5uvjq435r4q7ib3vtdjq120", setCookiePath = Nothing, setCookieExpires = Nothing, setCookieMaxAge = Nothing, setCookieDomain = Nothing, setCookieHttpOnly = False, setCookieSecure = False, setCookieSameSite = Nothing})
687696instance FromHttpApiData SetCookie where
688697 parseUrlPiece = parseHeader . encodeUtf8
689698 parseHeader = Right . parseSetCookie
699+
690700-------------------------------------------------------------------------------
691701-- Attoparsec helpers
692702-------------------------------------------------------------------------------