@@ -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