git.iko.soy/typeable/servant
on master help sign in
Merge pull request #899 from phadej/response-body-refactor
f5ffdc7Oleg Grenrus
servant-client-core/src/Servant/Client/Core.hs+2−1
@@ -40,7 +40,8 @@ module Servant.Client.Core
40
40
41
41
42 -- * Response
42 -- * Response
43− , Response(..)
43+ , Response
44+ , GenResponse (..)
44 , RunClient(..)
45 , RunClient(..)
45 , module Servant.Client.Core.Internal.BaseUrl
46 , module Servant.Client.Core.Internal.BaseUrl
46 , StreamingResponse(..)
47 , StreamingResponse(..)
servant-client-core/src/Servant/Client/Core/Internal/HasClient.hs+2−1
@@ -269,7 +269,8 @@ instance OVERLAPPABLE_
269 , requestMethod = reflectMethod (Proxy :: Proxy method)
269 , requestMethod = reflectMethod (Proxy :: Proxy method)
270 }
270 }
271 return . buildFromStream $ ResultStream $ \k ->
271 return . buildFromStream $ ResultStream $ \k ->
272− runStreamingResponse sresp $ \(_status,_headers,_httpversion,reader) -> do
272+ runStreamingResponse sresp $ \gres -> do
273+ let reader = responseBody gres
273 let unrender = unrenderFrames (Proxy :: Proxy framing) (Proxy :: Proxy a)
274 let unrender = unrenderFrames (Proxy :: Proxy framing) (Proxy :: Proxy a)
274 loop bs = do
275 loop bs = do
275 res <- BL.fromStrict <$> reader
276 res <- BL.fromStrict <$> reader
servant-client-core/src/Servant/Client/Core/Internal/Request.hs+7−5
@@ -1,8 +1,9 @@
1{-# LANGUAGE CPP #-}
1{-# LANGUAGE CPP #-}
2{-# LANGUAGE DeriveDataTypeable #-}
2{-# LANGUAGE DeriveDataTypeable #-}
3{-# LANGUAGE DeriveFunctor #-}
3{-# LANGUAGE DeriveFunctor #-}
4+{-# LANGUAGE DeriveFoldable #-}
5+{-# LANGUAGE DeriveTraversable #-}
4{-# LANGUAGE DeriveGeneric #-}
6{-# LANGUAGE DeriveGeneric #-}
5−{-# LANGUAGE GeneralizedNewtypeDeriving #-}
6{-# LANGUAGE MultiParamTypeClasses #-}
7{-# LANGUAGE MultiParamTypeClasses #-}
7{-# LANGUAGE RankNTypes #-}
8{-# LANGUAGE RankNTypes #-}
8{-# LANGUAGE OverloadedStrings #-}
9{-# LANGUAGE OverloadedStrings #-}
@@ -65,14 +66,15 @@ type Request = RequestF Builder.Builder
65newtype RequestBody = RequestBodyLBS LBS.ByteString
66newtype RequestBody = RequestBodyLBS LBS.ByteString
66 deriving (Eq, Ord, Read, Show, Typeable)
67 deriving (Eq, Ord, Read, Show, Typeable)
67
68
68−data Response = Response
69+data GenResponse a = Response
69 { responseStatusCode :: Status
70 { responseStatusCode :: Status
70− , responseBody :: LBS.ByteString
71 , responseHeaders :: Seq.Seq Header
71 , responseHeaders :: Seq.Seq Header
72 , responseHttpVersion :: HttpVersion
72 , responseHttpVersion :: HttpVersion
73+ , responseBody :: a
73− } deriving (Eq, Show, Generic, Typeable)
74+ } deriving (Eq, Show, Generic, Typeable, Functor, Foldable, Traversable)
74
75
76+type Response = GenResponse LBS.ByteString
75−data StreamingResponse = StreamingResponse { runStreamingResponse :: forall a. ((Status, Seq.Seq Header, HttpVersion, IO BS.ByteString) -> IO a) -> IO a }
77+newtype StreamingResponse = StreamingResponse { runStreamingResponse :: forall a. (GenResponse (IO BS.ByteString) -> IO a) -> IO a }
76
78
77-- A GET request to the top-level path
79-- A GET request to the top-level path
78defaultRequest :: Request
80defaultRequest :: Request
servant-client-core/src/Servant/Client/Core/Internal/RunClient.hs+1−1
@@ -18,7 +18,7 @@ import Network.HTTP.Media (MediaType, matches,
18import Servant.API (MimeUnrender,
18import Servant.API (MimeUnrender,
19 contentTypes,
19 contentTypes,
20 mimeUnrender)
20 mimeUnrender)
21−import Servant.Client.Core.Internal.Request (Request, Response (..),
21+import Servant.Client.Core.Internal.Request (Request, Response, GenResponse (..),
22 StreamingResponse (..),
22 StreamingResponse (..),
23 ServantError (..))
23 ServantError (..))
24
24
servant-client-core/src/Servant/Client/Core/Reexport.hs+4−1
@@ -5,8 +5,11 @@ module Servant.Client.Core.Reexport
5 (
5 (
6 -- * HasClient
6 -- * HasClient
7 HasClient(..)
7 HasClient(..)
8+
8 -- * Response (for @Raw@)
9 -- * Response (for @Raw@)
9− , Response(..)
10+ , Response
11+ , StreamingResponse
12+ , GenResponse(..)
10
13
11 -- * Generic Client
14 -- * Generic Client
12 , ClientLike(..)
15 , ClientLike(..)
servant-client/servant-client.cabal+3
@@ -49,6 +49,9 @@ library
49 , time >= 1.4.2 && < 1.9
49 , time >= 1.4.2 && < 1.9
50 , transformers >= 0.3.0.0 && < 0.6
50 , transformers >= 0.3.0.0 && < 0.6
51
51
52+ if !impl(ghc >= 8.0)
53+ build-depends: semigroups >=0.18.3 && <0.19
54+
52 -- Servant dependencies
55 -- Servant dependencies
53 build-depends:
56 build-depends:
54 servant-client-core == 0.12.*
57 servant-client-core == 0.12.*
servant-client/src/Servant/Client.hs+3−1
@@ -1,3 +1,5 @@
1+
2+
1-- | This module provides 'client' which can automatically generate
3-- | This module provides 'client' which can automatically generate
2-- querying functions for each endpoint just from the type representing your
4-- querying functions for each endpoint just from the type representing your
3-- API.
5-- API.
@@ -10,5 +12,5 @@ module Servant.Client
10 , module Servant.Client.Core.Reexport
12 , module Servant.Client.Core.Reexport
11 ) where
13 ) where
12
14
13−import Servant.Client.Internal.HttpClient
14import Servant.Client.Core.Reexport
15import Servant.Client.Core.Reexport
16+import Servant.Client.Internal.HttpClient
servant-client/src/Servant/Client/Internal/HttpClient.hs+4−7
@@ -8,11 +8,8 @@
8{-# LANGUAGE OverloadedStrings #-}
8{-# LANGUAGE OverloadedStrings #-}
9{-# LANGUAGE ScopedTypeVariables #-}
9{-# LANGUAGE ScopedTypeVariables #-}
10{-# LANGUAGE TypeFamilies #-}
10{-# LANGUAGE TypeFamilies #-}
11−
12−-- | @http-client@-based client requests executor
13module Servant.Client.Internal.HttpClient where
11module Servant.Client.Internal.HttpClient where
14
12
15−
16import Prelude ()
13import Prelude ()
17import Prelude.Compat
14import Prelude.Compat
18
15
@@ -31,7 +28,7 @@ import qualified Data.ByteString.Lazy as BSL
31import Data.Foldable (toList, for_)
28import Data.Foldable (toList, for_)
32import Data.Functor.Alt (Alt (..))
29import Data.Functor.Alt (Alt (..))
33import Data.Maybe (maybeToList)
30import Data.Maybe (maybeToList)
34−import Data.Monoid ((<>))
31+import Data.Semigroup ((<>))
35import Data.Proxy (Proxy (..))
32import Data.Proxy (Proxy (..))
36import Data.Sequence (fromList)
33import Data.Sequence (fromList)
37import Data.String (fromString)
34import Data.String (fromString)
@@ -151,10 +148,10 @@ performStreamingRequest req = do
151 status_code = statusCode status
148 status_code = statusCode status
152 unless (status_code >= 200 && status_code < 300) $ do
149 unless (status_code >= 200 && status_code < 300) $ do
153 b <- BSL.fromChunks <$> Client.brConsume (Client.responseBody r)
150 b <- BSL.fromChunks <$> Client.brConsume (Client.responseBody r)
154− throw $ FailureResponse $ Response status b (fromList $ Client.responseHeaders r) (Client.responseVersion r)
151+ throw $ FailureResponse $ clientResponseToResponse r { Client.responseBody = b }
155− k (status, fromList $ Client.responseHeaders r, Client.responseVersion r, Client.responseBody r)
152+ k (clientResponseToResponse r)
156
153
157−clientResponseToResponse :: Client.Response BSL.ByteString -> Response
154+clientResponseToResponse :: Client.Response a -> GenResponse a
158clientResponseToResponse r = Response
155clientResponseToResponse r = Response
159 { responseStatusCode = Client.responseStatus r
156 { responseStatusCode = Client.responseStatus r
160 , responseBody = Client.responseBody r
157 , responseBody = Client.responseBody r
servant/servant.cabal+1−1
@@ -71,7 +71,7 @@ library
71 build-depends:
71 build-depends:
72 base >= 4.7 && < 4.11
72 base >= 4.7 && < 4.11
73 , bytestring >= 0.10.4.0 && < 0.11
73 , bytestring >= 0.10.4.0 && < 0.11
74− , mtl >= 2.0.1 && < 2.3
74+ , mtl >= 2.1 && < 2.3
75 , text >= 1.2.3.0 && < 1.3
75 , text >= 1.2.3.0 && < 1.3
76
76
77 if !impl(ghc >= 8.0)
77 if !impl(ghc >= 8.0)