git.iko.soy/typeable/servant
on master help sign in
Parametrise over body contents only
commit3a9a1ca55b745453453cc5b0abd0c2af635784f7 authorOleg Grenrus <oleg.grenrus@iki.fi> dateTue 5 Feb 2019, 11:51 (8 years ago) parent9a655fd
4 files changed+51−22
servant-client-core/servant-client-core.cabal+5−1 servant-client-core/src/Servant/Client/Core/Internal/Request.hs+36−18 servant-client/servant-client.cabal+4 servant-client/src/Servant/Client/Internal/HttpClient.hs+6−3
servant-client-core/servant-client-core.cabal+5−1
@@ -58,9 +58,13 @@ library
5858 , transformers >= 0.5.2.0 && < 0.6
5959 , template-haskell >= 2.11.1.0 && < 2.15
6060
61+ if !impl(ghc >= 8.2)
62+ build-depends:
63+ bifunctors >= 5.5.3 && < 5.6
64+
6165 -- Servant dependencies
6266 build-depends:
63− servant >= 0.15 && <0.16
67+ servant >= 0.15 && <0.16
6468
6569 -- Other dependencies: Lower bound around what is in the latest Stackage LTS.
6670 -- Here can be exceptions if we really need features from the newer versions.
servant-client-core/src/Servant/Client/Core/Internal/Request.hs+36−18
@@ -19,14 +19,20 @@ import Control.DeepSeq
1919 (NFData (..))
2020import Control.Monad.Catch
2121 (Exception)
22−import qualified Data.ByteString as BS
23−import qualified Data.ByteString.Builder as Builder
24−import qualified Data.ByteString.Lazy as LBS
22+import Data.Bifoldable
23+ (Bifoldable (..))
24+import Data.Bifunctor
25+ (Bifunctor (..))
26+import Data.Bitraversable
27+ (Bitraversable (..), bifoldMapDefault, bimapDefault)
28+import qualified Data.ByteString as BS
29+import qualified Data.ByteString.Builder as Builder
30+import qualified Data.ByteString.Lazy as LBS
2531import Data.Int
2632 (Int64)
2733import Data.Semigroup
2834 ((<>))
29−import qualified Data.Sequence as Seq
35+import qualified Data.Sequence as Seq
3036import Data.Text
3137 (Text)
3238import Data.Text.Encoding
@@ -40,10 +46,10 @@ import Network.HTTP.Media
4046import Network.HTTP.Types
4147 (Header, HeaderName, HttpVersion (..), Method, QueryItem,
4248 Status (..), http11, methodGet)
43−import Servant.Client.Core.Internal.BaseUrl
44− (BaseUrl)
4549import Servant.API
4650 (ToHttpApiData, toEncodedUrlPiece, toHeader)
51+import Servant.Client.Core.Internal.BaseUrl
52+ (BaseUrl)
4753
4854-- | A type representing possible errors in a request
4955--
@@ -83,24 +89,36 @@ mediaTypeRnf mt =
8389data RequestF body path = Request
8490 { requestPath :: path
8591 , requestQueryString :: Seq.Seq QueryItem
86− , requestBody :: body
92+ , requestBody :: Maybe (body, MediaType)
8793 , requestAccept :: Seq.Seq MediaType
8894 , requestHeaders :: Seq.Seq Header
8995 , requestHttpVersion :: HttpVersion
9096 , requestMethod :: Method
91− } deriving (Generic, Typeable, Eq, Show)
97+ } deriving (Generic, Typeable, Eq, Show, Functor, Foldable, Traversable)
98+
99+instance Bifunctor RequestF where bimap = bimapDefault
100+instance Bifoldable RequestF where bifoldMap = bifoldMapDefault
101+instance Bitraversable RequestF where
102+ bitraverse f g r = mk
103+ <$> traverse (bitraverse f pure) (requestBody r)
104+ <*> g (requestPath r)
105+ where
106+ mk b p = r { requestBody = b, requestPath = p }
92107
93108instance (NFData path, NFData body) => NFData (RequestF body path) where
94− rnf r =
95− rnf (requestPath r)
96− `seq` rnf (requestQueryString r)
97− `seq` rnf (requestBody r)
98− `seq` rnf (fmap mediaTypeRnf (requestAccept r))
99− `seq` rnf (requestHeaders r)
100− `seq` requestHttpVersion r
101− `seq` rnf (requestMethod r)
102−
103−type Request = RequestF (Maybe (RequestBody, MediaType)) Builder.Builder
109+ rnf r =
110+ rnf (requestPath r)
111+ `seq` rnf (requestQueryString r)
112+ `seq` rnfB (requestBody r)
113+ `seq` rnf (fmap mediaTypeRnf (requestAccept r))
114+ `seq` rnf (requestHeaders r)
115+ `seq` requestHttpVersion r
116+ `seq` rnf (requestMethod r)
117+ where
118+ rnfB Nothing = ()
119+ rnfB (Just (b, mt)) = rnf b `seq` mediaTypeRnf mt
120+
121+type Request = RequestF RequestBody Builder.Builder
104122
105123-- | The request body. A replica of the @http-client@ @RequestBody@.
106124data RequestBody
servant-client/servant-client.cabal+4
@@ -55,6 +55,10 @@ library
5555 , time >= 1.6.0.1 && < 1.9
5656 , transformers >= 0.5.2.0 && < 0.6
5757
58+ if !impl(ghc >= 8.2)
59+ build-depends:
60+ bifunctors >= 5.5.3 && < 5.6
61+
5862 -- Servant dependencies.
5963 -- Strict dependency on `servant-client-core` as we re-export things.
6064 build-depends:
servant-client/src/Servant/Client/Internal/HttpClient.hs+6−3
@@ -31,6 +31,8 @@ import Control.Monad.STM
3131import Control.Monad.Trans.Control
3232 (MonadBaseControl (..))
3333import Control.Monad.Trans.Except
34+import Data.Bifunctor
35+ (bimap)
3436import Data.ByteString.Builder
3537 (toLazyByteString)
3638import qualified Data.ByteString.Lazy as BSL
@@ -196,9 +198,10 @@ performRequest req = do
196198 fRes = Client.hrFinalResponse responses
197199
198200mkFailureResponse :: BaseUrl -> Request -> GenResponse BSL.ByteString -> ServantError
199−mkFailureResponse burl request ourResponse =
200− FailureResponse (request {requestPath = (burl, path), requestBody = ()}) ourResponse
201− where path = BSL.toStrict $ toLazyByteString $ requestPath request
201+mkFailureResponse burl request =
202+ FailureResponse (bimap (const ()) f request)
203+ where
204+ f b = (burl, BSL.toStrict $ toLazyByteString b)
202205
203206clientResponseToResponse :: Client.Response a -> GenResponse a
204207clientResponseToResponse r = Response