2017-08-02 101 views
0

我正在尝试创建一些将500个错误发送到远程服务器的中间件。错误信息在响应主体中。如何阅读WAI中间件的响应主体?

如何从Response获得响应体作为任何类型的字符串?我看到responseToStream,但我无法弄清楚如何使用它。

import Network.Wai 
import Data.ByteString.Lazy (ByteString) 

responseBody :: Response -> IO ByteString 
responseBody res = _ 
+1

responseToStream'的'结果是3元组;我用“body”来猜测,你的意思是你对第三个组件感兴趣,而不是前两个(它们是具体的,即非抽象的代数类型,所以你可以直接访问它们的字段)。对于第三个comp,你可能只需要传递一个'Builder - > IO()'的函数,''将每个'Builder'映射到'IORef'(或者在并发设置中是'MVar') - “第一个参数提供了发送另一块数据的方法“(这里”发送“只是保存在内存中)。 – user2407038

回答

0

由@注释的实现user2407038:

import Data.IORef (newIORef,modifyIORef',readIORef) 
import Data.Monoid ((<>)) 
import Data.ByteString.Lazy (ByteString) 
import Data.ByteString.Builder (toLazyByteString) 

import Network.Wai 

responseBody :: Response -> IO ByteString 
responseBody res = 
    let (status,headers,body) = responseToStream res in 
    body $ \f -> do 
    content <- newIORef mempty 
    f (\chunk -> modifyIORef' content (<> chunk)) (return()) 
    toLazyByteString <$> readIORef content