git.iko.soy/typeable/http-api-data
on master help sign in
Squashed commit of the following:
2c0800eOleg Grenrus
http-api-data.cabal+2−1
@@ -51,7 +51,8 @@ library
51 , time >= 1.4.2 && < 1.9
51 , time >= 1.4.2 && < 1.9
52 , time-locale-compat >= 0.1.1.0 && < 0.2
52 , time-locale-compat >= 0.1.1.0 && < 0.2
53 , unordered-containers >= 0.2.6.0 && < 0.3
53 , unordered-containers >= 0.2.6.0 && < 0.3
54− , uuid-types >= 1.0.2 && <1.1
54+ , uuid-types >= 1.0.2 && < 1.1
55+ , cookie >= 0.4 && < 0.45
55 if !impl(ghc >= 8.0)
56 if !impl(ghc >= 8.0)
56 build-depends: semigroups >= 0.16 && < 0.19
57 build-depends: semigroups >= 0.16 && < 0.19
57 if flag(use-text-show)
58 if flag(use-text-show)
src/Web/FormUrlEncoded.hs+1−1
@@ -47,5 +47,5 @@ module Web.FormUrlEncoded (
47 urlDecodeParams,
47 urlDecodeParams,
48) where
48) where
49
49
50−import Web.Internal.FormUrlEncoded
50+import Web.Internal.FormUrlEncoded
51
51
src/Web/HttpApiData.hs+1−1
@@ -43,7 +43,7 @@ module Web.HttpApiData (
43 readTextData,
43 readTextData,
44) where
44) where
45
45
46−import Web.Internal.HttpApiData
46+import Web.Internal.HttpApiData
47
47
48-- $setup
48-- $setup
49--
49--
src/Web/Internal/FormUrlEncoded.hs+13−13
@@ -1,5 +1,5 @@
1−{-# LANGUAGE ConstraintKinds #-}
2{-# LANGUAGE CPP #-}
1{-# LANGUAGE CPP #-}
2+{-# LANGUAGE ConstraintKinds #-}
3{-# LANGUAGE DataKinds #-}
3{-# LANGUAGE DataKinds #-}
4{-# LANGUAGE DefaultSignatures #-}
4{-# LANGUAGE DefaultSignatures #-}
5{-# LANGUAGE DeriveGeneric #-}
5{-# LANGUAGE DeriveGeneric #-}
@@ -18,14 +18,14 @@
18module Web.Internal.FormUrlEncoded where
18module Web.Internal.FormUrlEncoded where
19
19
20#if __GLASGOW_HASKELL__ < 710
20#if __GLASGOW_HASKELL__ < 710
21−import Control.Applicative
21+import Control.Applicative
22−import Data.Traversable
22+import Data.Traversable
23#endif
23#endif
24
24
25
25
26import Control.Arrow ((***))
26import Control.Arrow ((***))
27import Control.Monad ((<=<))
27import Control.Monad ((<=<))
28−import Data.ByteString.Builder (toLazyByteString, shortByteString)
28+import Data.ByteString.Builder (shortByteString, toLazyByteString)
29import qualified Data.ByteString.Lazy as BSL
29import qualified Data.ByteString.Lazy as BSL
30import qualified Data.ByteString.Lazy.Char8 as BSL8
30import qualified Data.ByteString.Lazy.Char8 as BSL8
31import qualified Data.Foldable as F
31import qualified Data.Foldable as F
@@ -39,30 +39,30 @@ import Data.List (intersperse, sortBy)
39import Data.Map (Map)
39import Data.Map (Map)
40import qualified Data.Map as Map
40import qualified Data.Map as Map
41import Data.Monoid
41import Data.Monoid
42−import qualified Data.Semigroup as Semi
43import Data.Ord (comparing)
42import Data.Ord (comparing)
43+import qualified Data.Semigroup as Semi
44
44
45import Data.Text (Text)
45import Data.Text (Text)
46import qualified Data.Text as Text
46import qualified Data.Text as Text
47−import qualified Data.Text.Lazy as Lazy
48import Data.Text.Encoding as Text
47import Data.Text.Encoding as Text
49import Data.Text.Encoding.Error (lenientDecode)
48import Data.Text.Encoding.Error (lenientDecode)
49+import qualified Data.Text.Lazy as Lazy
50
50
51−import Data.Time
52import Data.Proxy
51import Data.Proxy
52+import Data.Time
53import Data.Word
53import Data.Word
54
54
55#if MIN_VERSION_base(4,8,0)
55#if MIN_VERSION_base(4,8,0)
56−import Data.Void
56+import Data.Void
57−import Numeric.Natural
57+import Numeric.Natural
58#endif
58#endif
59
59
60−import GHC.Exts (IsList (..), Constraint)
60+import GHC.Exts (Constraint, IsList (..))
61import GHC.Generics
61import GHC.Generics
62import GHC.TypeLits
62import GHC.TypeLits
63−import Network.HTTP.Types.URI (urlEncodeBuilder, urlDecode)
63+import Network.HTTP.Types.URI (urlDecode, urlEncodeBuilder)
64
64
65−import Web.Internal.HttpApiData
65+import Web.Internal.HttpApiData
66
66
67-- $setup
67-- $setup
68-- >>> :set -XDeriveGeneric
68-- >>> :set -XDeriveGeneric
@@ -546,7 +546,7 @@ urlEncodeParams = toLazyByteString . mconcat . intersperse (shortByteString "&")
546 escape = urlEncodeBuilder True . Text.encodeUtf8
546 escape = urlEncodeBuilder True . Text.encodeUtf8
547
547
548 encodePair (k, "") = escape k
548 encodePair (k, "") = escape k
549− encodePair (k, v) = escape k <> shortByteString "=" <> escape v
549+ encodePair (k, v) = escape k <> shortByteString "=" <> escape v
550
550
551-- | Decode an @application/x-www-form-urlencoded@ 'BSL.ByteString' to a 'Form'.
551-- | Decode an @application/x-www-form-urlencoded@ 'BSL.ByteString' to a 'Form'.
552--
552--
src/Web/Internal/HttpApiData.hs+57−39
@@ -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 #-}
11-- |
11-- |
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
15
15
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))
20#endif
20#endif
21
21
22−import Control.Arrow ((&&&), left)
22+import Control.Arrow (left, (&&&))
23−import Control.Monad ((<=<))
23+import Control.Monad ((<=<))
24
24
25−import Data.Monoid
26−import Data.ByteString (ByteString)
25+import Data.ByteString (ByteString)
27−import qualified Data.ByteString as BS
26+import qualified Data.ByteString as BS
27+import Data.Monoid
28
28
29−import Data.Int
29+import Data.Int
30−import Data.Word
30+import Data.Word
31
31
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
37
38
39+import Data.Time
38−import Data.Time.Locale.Compat
40+import Data.Time.Locale.Compat
39−import Data.Time
40−import Data.Version
41+import Data.Version
41
42
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
45#endif
46#endif
46
47
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)
49
50
50#if USE_TEXT_SHOW
51#if USE_TEXT_SHOW
51−import TextShow (TextShow, showt)
52+import TextShow (TextShow, showt)
52#endif
53#endif
53
54
54−import qualified Data.UUID.Types as UUID
55+import qualified Data.UUID.Types as UUID
55
56
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
60
61
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
64+
65+import Web.Cookie (SetCookie, parseSetCookie,
66+ renderSetCookie)
63
67
64
68
65-- $setup
69-- $setup
@@ -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
532
536
537+-- |
538+-- >>> let Right c = parseUrlPiece "SESSID=r2t5uvjq435r4q7ib3vtdjq120" :: Either Text SetCookie
539+-- >>> toUrlPiece c
540+-- "\"SESSID=r2t5uvjq435r4q7ib3vtdjq120\""
541+instance ToHttpApiData SetCookie where
542+ toUrlPiece = showt . BS.toLazyByteString . renderSetCookie
543+ toEncodedUrlPiece = renderSetCookie
544+
533-- |
545-- |
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
666
678
679+-- |
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-------------------------------------------------------------------------------
stack.yaml+3−9
@@ -1,12 +1,6 @@
1−resolver: nightly-2017-04-01
2−
3−packages:
4−- '.'
5−
6flags:
1flags:
7 http-api-data:
2 http-api-data:
8 use-text-show: false
3 use-text-show: false
9−
4+packages:
10−extra-deps:
5+- .
11−- attoparsec-iso8601-1.0.0.0
6+resolver: lts-12.9
12−extra-package-dbs: []