Description
Conduit streaming support for Hreq.
Description
Conduit streaming support for Hreq an HTTP client library.
README.md
Hreq
Implementation of Hreq client as an HTTP Conduit streaming client basing on hreq-core. More streaming backends can be added in the future depending on community interest.
Please look at the repository README.md file for more information.
Streaming Example
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
import Conduit
import Data.Functor (void)
import qualified Data.Text as T
import Hreq.Conduit
main' :: IO ()
main' = void $ do
runHttpBin streamResponse
streamFile "README.md"
runHttpBin :: Hreq IO a -> IO a
runHttpBin action = runHreq baseUrl action
where
baseUrl = HttpsDomain "httpbin.org"
-- | Stream data from an endpoint and write it into a temporary file
streamResponse :: RunConduitClient m => m ()
streamResponse =
hreqWithConduit
@("stream-bytes" :> Capture Int :> StreamGet)
(size :. Empty)
$ \ src -> void $ runConduitRes $ src .| sinkSystemTempFile "hreq.json"
where
size = 3 * 1024 * 1024 -- amount of data to stream in MBs
-- | stream data from a file and send it as a Request body stream over the network.
streamFile :: String -> IO Response
streamFile fp =
withSourceFile fp $
\srcFile -> do
let src :: ReqBodySource
src = ReqBodySource
$ srcFile
.| decodeUtf8C
.| mapC T.toUpper
.| encodeUtf8C
runHttpBin $ streamReq src
where
streamReq :: RunClient m => ReqBodySource -> m Response
streamReq src = hreq @("post" :> ConduitReqBody :> RawResponse POST) (src :. Empty)
Documentation
This README is tested by markdown-unlit
to make sure the code builds. To keep that happy, we do need a main
in this file, so ignore the following :)
main :: IO ()
main = pure ()