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
responseChunksmanagerModifyResponse
不与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