haskell 我如何使用阿威和http-client来创建一个代理,使其能够流式传输服务器发送的事件?

v09wglhw  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(147)

看起来阿威的responseStream应该允许流服务器发送的事件,但是当我这样做时,

import qualified Network.HTTP.Client                  as H
import qualified Network.Wai                          as W
…
  respond $ W.responseStream 
                 (H.responseStatus response) 
                 (H.responseHeaders response) 
                 (H.responseBody response)

字符串
我猜是H.responseBody使用了它,但它只是一个类似Response body -> body的getter--我如何让它代理流?

2lpgd968

2lpgd9681#

找到了一个解决方案,通过流字节串作为阿威HTTP服务器响应体(尽管不依赖于Streaming):

…
    respond $ W.responseStream 
                   (H.responseStatus response) 
                   (H.responseHeaders response) 
                   (streamBody response)

-- type W.StreamingBody = (Builder -> IO ()) -> IO () -> IO ()
streamBody :: H.Response H.BodyReader -> W.StreamingBody
streamBody response writeBuilder flush = do
  chunk <- H.brRead (H.responseBody response)
  unless (S.null chunk) $ do
    writeBuilder (S.byteString chunk)
    flush
    streamBody response writeBuilder flush

字符串

相关问题