@@ -24,6 +24,7 @@ import Control.Monad ((<=<))
25import Data.ByteString (ByteString)
25import Data.ByteString (ByteString)
26import qualified Data.ByteString as BS
26import qualified Data.ByteString as BS
27+import qualified Data.ByteString.Lazy as LBS
27import Data.Monoid
28import Data.Monoid
29import qualified Data.Fixed as F
30import qualified Data.Fixed as F
@@ -32,7 +33,8 @@ import Data.Word
33import Data.Text (Text)
34import Data.Text (Text)
34import qualified Data.Text as T
35import 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)
36import qualified Data.Text.Lazy as L
38import qualified Data.Text.Lazy as L
37import Data.Text.Read (Reader, decimal, rational,
39import Data.Text.Read (Reader, decimal, rational,
@@ -539,13 +541,19 @@ instance (ToHttpApiData a, ToHttpApiData b) => ToHttpApiData (Either a b) where
539 toUrlPiece (Left x) = "left " <> toUrlPiece x
541 toUrlPiece (Left x) = "left " <> toUrlPiece x
540 toUrlPiece (Right x) = "right " <> toUrlPiece x
542 toUrlPiece (Right x) = "right " <> toUrlPiece x
542−-- |
544+-- | /Note:/ this instance works correctly for alphanumeric name and value
543-- >>> let Right c = parseUrlPiece "SESSID=r2t5uvjq435r4q7ib3vtdjq120" :: Either Text SetCookie
546-- >>> let Right c = parseUrlPiece "SESSID=r2t5uvjq435r4q7ib3vtdjq120" :: Either Text SetCookie
544-- >>> toUrlPiece c
547-- >>> toUrlPiece c
548+-- "SESSID=r2t5uvjq435r4q7ib3vtdjq120"
545−-- "\"SESSID=r2t5uvjq435r4q7ib3vtdjq120\""
551+-- "SESSID=r2t5uvjq435r4q7ib3vtdjq120"
546instance ToHttpApiData SetCookie where
553instance ToHttpApiData SetCookie where
554+ toUrlPiece = decodeUtf8With lenientDecode . toHeader
547− toUrlPiece = showt . BS.toLazyByteString . renderSetCookie
555+ toHeader = LBS.toStrict . BS.toLazyByteString . renderSetCookie
548− toEncodedUrlPiece = renderSetCookie
556+ -- toEncodedUrlPiece = renderSetCookie -- doesn't do things.
551-- >>> parseUrlPiece "_" :: Either Text ()
559-- >>> parseUrlPiece "_" :: Either Text ()
@@ -681,12 +689,14 @@ instance FromHttpApiData a => FromHttpApiData (LenientData a) where
681 parseHeader = Right . LenientData . parseHeader
689 parseHeader = Right . LenientData . parseHeader
682 parseQueryParam = Right . LenientData . parseQueryParam
690 parseQueryParam = Right . LenientData . parseQueryParam
684−-- |
692+-- | /Note:/ this instance works correctly for alphanumeric name and value
685-- >>> parseUrlPiece "SESSID=r2t5uvjq435r4q7ib3vtdjq120" :: Either Text SetCookie
694-- >>> parseUrlPiece "SESSID=r2t5uvjq435r4q7ib3vtdjq120" :: Either Text SetCookie
686-- Right (SetCookie {setCookieName = "SESSID", setCookieValue = "r2t5uvjq435r4q7ib3vtdjq120", setCookiePath = Nothing, setCookieExpires = Nothing, setCookieMaxAge = Nothing, setCookieDomain = Nothing, setCookieHttpOnly = False, setCookieSecure = False, setCookieSameSite = Nothing})
695-- Right (SetCookie {setCookieName = "SESSID", setCookieValue = "r2t5uvjq435r4q7ib3vtdjq120", setCookiePath = Nothing, setCookieExpires = Nothing, setCookieMaxAge = Nothing, setCookieDomain = Nothing, setCookieHttpOnly = False, setCookieSecure = False, setCookieSameSite = Nothing})
687instance FromHttpApiData SetCookie where
696instance FromHttpApiData SetCookie where
688 parseUrlPiece = parseHeader . encodeUtf8
697 parseUrlPiece = parseHeader . encodeUtf8
689 parseHeader = Right . parseSetCookie
698 parseHeader = Right . parseSetCookie
690-------------------------------------------------------------------------------
700-------------------------------------------------------------------------------
691-- Attoparsec helpers
701-- Attoparsec helpers
692-------------------------------------------------------------------------------
702-------------------------------------------------------------------------------