Haskell 记录http管道的所有请求和响应

Haskell 记录http管道的所有请求和响应,haskell,bytestring,http-conduit,Haskell,Bytestring,Http Conduit,我编写了这个ManagerSettings来记录我的http导管应用程序的所有请求和响应。(顺便说一下,我正在导入classyprellude) tracingManagerSettings::ManagerSettings 跟踪管理器设置= TlsManager设置{managerModifyRequest=\req->do putStr“跟踪:” 打印请求 putStrLn“” 纯需求 ,managerModifyResponse=\r->do responseChunksmanagerMo

我编写了这个
ManagerSettings
来记录我的http导管应用程序的所有请求和响应。(顺便说一下,我正在导入
classyprellude

tracingManagerSettings::ManagerSettings
跟踪管理器设置=
TlsManager设置{managerModifyRequest=\req->do
putStr“跟踪:”
打印请求
putStrLn“”
纯需求
,managerModifyResponse=\r->do

responseChunks
managerModifyResponse
不与
Response ByteString
一起工作,它与
响应BodyReader
一起工作,其中
键入BodyReader=IO ByteString
以及一个契约,即如果它生成一个非空的
ByteString
,则可以读取更多的输入

您遇到的问题是,
pure fullResponse
永远不会返回空的
ByteString
,除非它总是返回空的。您需要提供更复杂的IO操作来捕获预期的行为。可能是这样的(未测试):

returnOnce::monoidA=>a->IO(IO a)
返回一次x=do
裁判
tracingManagerSettings :: ManagerSettings
tracingManagerSettings =
  tlsManagerSettings { managerModifyRequest = \req -> do
                         putStr "TRACE: "
                         print req
                         putStrLn ""
                         pure req
                     , managerModifyResponse = \r -> do
                         responseChunks <- brConsume $ responseBody r
                         let fullResponse = mconcat responseChunks
                         putStr "TRACE: RESPONSE: "
                         putStrLn $ decodeUtf8 fullResponse
                         pure $ r { responseBody = pure fullResponse }
                     }
returnOnce :: Monoid a => a -> IO (IO a)
returnOnce x = do
    ref <- newIORef x
    pure $ readIORef ref <* writeIORef ref mempty