From dbd92a48851af4c6d513fb115512585ada6ac010 Mon Sep 17 00:00:00 2001 From: Leonid Onokhov Date: Fri, 26 Jul 2019 10:30:06 +0000 Subject: [PATCH] HasClient instance for Stream with Headers Fixes #1170 --- .../src/Servant/Client/Core/HasClient.hs | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/servant-client-core/src/Servant/Client/Core/HasClient.hs b/servant-client-core/src/Servant/Client/Core/HasClient.hs index 4f7a0327..5c78bee6 100644 --- a/servant-client-core/src/Servant/Client/Core/HasClient.hs +++ b/servant-client-core/src/Servant/Client/Core/HasClient.hs @@ -297,6 +297,31 @@ instance {-# OVERLAPPABLE #-} , requestMethod = reflectMethod (Proxy :: Proxy method) } +instance {-# OVERLAPPING #-} + ( RunStreamingClient m, MimeUnrender ct chunk, ReflectMethod method, + FramingUnrender framing, FromSourceIO chunk a, + BuildHeadersTo hs + ) => HasClient m (Stream method status framing ct (Headers hs a)) where + + type Client m (Stream method status framing ct (Headers hs a)) = m (Headers hs a) + + hoistClientMonad _ _ f ma = f ma + + clientWithRoute _pm Proxy req = withStreamingRequest req' $ \gres -> do + let mimeUnrender' = mimeUnrender (Proxy :: Proxy ct) :: BL.ByteString -> Either String chunk + framingUnrender' = framingUnrender (Proxy :: Proxy framing) mimeUnrender' + val = fromSourceIO $ framingUnrender' $ responseBody gres + return $ Headers + { getResponse = val + , getHeadersHList = buildHeadersTo . toList $ responseHeaders gres + } + + where + req' = req + { requestAccept = fromList [contentType (Proxy :: Proxy ct)] + , requestMethod = reflectMethod (Proxy :: Proxy method) + } + -- | If you use a 'Header' in one of your endpoints in your API, -- the corresponding querying function will automatically take -- an additional argument of the type specified by your 'Header',