我使用的是Control.Monad.Managed
包装pipes-http
的withHTTP
一个延续变压器,但我也想以后流的HTTP响应进行:
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响应?
如果我严重误解了续篇和内容,请多谢与歉意。
您对的定义fromHTTP
有些困难,但是很明显,您在实际开始使用生产者之前已经退出了托管环境。这样的事情可能更接近您的意图:
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)
managedManager :: ManagerSettings -> Managed Manager
managedManager settings = managed (withManager settings)
main = runManaged $
do request <- liftIO $ parseUrl "http://en.wikipedia.org/"
manager <- managedManager defaultManagerSettings
producer <- managedHTTP request manager
liftIO $ runEffect $ responseBody producer >-> stdout
或只是废弃定义并写
main = runManaged $
do request <- liftIO $ parseUrl "http://en.wikipedia.org/"
manager <- managed (withManager defaultManagerSettings)
producer <- managed (withHTTP request manager)
liftIO $ runEffect $ responseBody producer >-> stdout
请注意,您也可以使生产者在Managed
monad中运行:
main = runManaged $
do request <- liftIO $ parseUrl "http://en.wikipedia.org/"
manager <- managed (withManager defaultManagerSettings)
producer <- managed (withHTTP request manager)
runEffect $ hoist liftIO (responseBody producer) >-> stdout
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句