我用来将'sControl.Monad.Managed
包装在一个延续转换器中,但我还想在之后将 HTTP 响应流式传输出去:pipes-http
withHTTP
import Pipes
import Pipes.ByteString
import Pipes.HTTP
import Control.Applicative
import Control.Monad
import Control.Monad.Managed
import qualified Data.ByteString.Char8 as BC
type RespBody = BC.ByteString
managedHTTP :: Request -> Manager -> Managed (Response (Producer RespBody IO ()))
managedHTTP r m = managed (withHTTP r m)
fromHTTP :: Request -> Manager -> Producer RespBody IO ()
fromHTTP request manager = join $ liftIO $ fmap (hoist liftIO) $ with response return
where response = responseBody <$> managedHTTP request manager
这fromHTTP
是为了流出响应体。如果以上运行:
main = do
request <- parseUrl "http://en.wikipedia.org/"
manager <- newManager defaultManagerSettings
runEffect $ fromHTTP request manager >-> stdout
我recv: invalid argument (Bad file descriptor)
在第一块之后得到,因为http-client
'responseClose
已经关闭了我的响应正文。
with
如果我想公开一个非样式接口,我应该如何使用管道流式传输 HTTP 响应?
如果我严重误解了延续和管道,谢谢并道歉。