如何在WAI/scotty中记录整个HTTP请求?

Gur*_*geh 11 haskell

我目前从Network.Wai.Middleware.RequestLogger运行中间件logStdoutDev,但它只记录路径和Accept标头(也可能是其他标头).我也希望看到POST和PUT请求的正文.这个身体恰好是json,所以只需将它打印到stdout即可.

我已经搜索了一个WAI中间件,它记录了所有内容,但没有找到任何内容.我真的不太了解WAI内部的东西来写一些提取POST体的东西,然后把它放回自己,所以我希望现在避免这种学习曲线.

joo*_*zek 3

WAIMiddleware只是一个转变Application

type Middleware = Application -> Application
Run Code Online (Sandbox Code Playgroud)

并且Application只是一个处理程序:

type Application = Request -> (Response -> IO ResponseReceived) -> IO ResponseReceived
Run Code Online (Sandbox Code Playgroud)

您需要做的就是定义处理程序,该处理程序将记录您想要的任何内容并将“实际工作”委托给下游:

-- note that this is equivalent to Application -> Application
logAllMiddleware :: Application -> Request -> (Response -> IO ResponseReceived) -> IO ResponseReceived
logAllMiddleware app req respond = do
    print . unpack . requestBody req
    app req respond
Run Code Online (Sandbox Code Playgroud)

请记住,我在没有访问 ghc 的情况下编写了这段代码。它可能不完全正确。