@@ -19,14 +19,20 @@ import Control.DeepSeq
19 (NFData (..))
19 (NFData (..))
20import Control.Monad.Catch
20import Control.Monad.Catch
21 (Exception)
21 (Exception)
22+import Data.Bifoldable
26+import Data.Bitraversable
27+ (Bitraversable (..), bifoldMapDefault, bimapDefault)
22−import qualified Data.ByteString as BS
28+import qualified Data.ByteString as BS
23−import qualified Data.ByteString.Builder as Builder
29+import qualified Data.ByteString.Builder as Builder
24−import qualified Data.ByteString.Lazy as LBS
30+import qualified Data.ByteString.Lazy as LBS
25import Data.Int
31import Data.Int
27import Data.Semigroup
33import Data.Semigroup
29−import qualified Data.Sequence as Seq
35+import qualified Data.Sequence as Seq
30import Data.Text
36import Data.Text
32import Data.Text.Encoding
38import Data.Text.Encoding
@@ -40,10 +46,10 @@ import Network.HTTP.Media
40import Network.HTTP.Types
46import Network.HTTP.Types
41 (Header, HeaderName, HttpVersion (..), Method, QueryItem,
47 (Header, HeaderName, HttpVersion (..), Method, QueryItem,
42 Status (..), http11, methodGet)
48 Status (..), http11, methodGet)
43−import Servant.Client.Core.Internal.BaseUrl
45import Servant.API
49import Servant.API
46 (ToHttpApiData, toEncodedUrlPiece, toHeader)
50 (ToHttpApiData, toEncodedUrlPiece, toHeader)
51+import Servant.Client.Core.Internal.BaseUrl
48-- | A type representing possible errors in a request
54-- | A type representing possible errors in a request
@@ -83,24 +89,36 @@ mediaTypeRnf mt =
83data RequestF body path = Request
89data RequestF body path = Request
84 { requestPath :: path
90 { requestPath :: path
85 , requestQueryString :: Seq.Seq QueryItem
91 , requestQueryString :: Seq.Seq QueryItem
86− , requestBody :: body
92+ , requestBody :: Maybe (body, MediaType)
87 , requestAccept :: Seq.Seq MediaType
93 , requestAccept :: Seq.Seq MediaType
88 , requestHeaders :: Seq.Seq Header
94 , requestHeaders :: Seq.Seq Header
89 , requestHttpVersion :: HttpVersion
95 , requestHttpVersion :: HttpVersion
90 , requestMethod :: Method
96 , requestMethod :: Method
91− } deriving (Generic, Typeable, Eq, Show)
97+ } deriving (Generic, Typeable, Eq, Show, Functor, Foldable, Traversable)
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)
106+ mk b p = r { requestBody = b, requestPath = p }
93instance (NFData path, NFData body) => NFData (RequestF body path) where
108instance (NFData path, NFData body) => NFData (RequestF body path) where
95− rnf (requestPath r)
110+ rnf (requestPath r)
96− `seq` rnf (requestQueryString r)
111+ `seq` rnf (requestQueryString r)
97− `seq` rnf (requestBody r)
112+ `seq` rnfB (requestBody r)
98− `seq` rnf (fmap mediaTypeRnf (requestAccept r))
113+ `seq` rnf (fmap mediaTypeRnf (requestAccept r))
99− `seq` rnf (requestHeaders r)
114+ `seq` rnf (requestHeaders r)
100− `seq` requestHttpVersion r
115+ `seq` requestHttpVersion r
101− `seq` rnf (requestMethod r)
116+ `seq` rnf (requestMethod r)
119+ rnfB (Just (b, mt)) = rnf b `seq` mediaTypeRnf mt
103−type Request = RequestF (Maybe (RequestBody, MediaType)) Builder.Builder
121+type Request = RequestF RequestBody Builder.Builder
105-- | The request body. A replica of the @http-client@ @RequestBody@.
123-- | The request body. A replica of the @http-client@ @RequestBody@.
106data RequestBody
124data RequestBody