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

时间:2013-05-02 12:24:03

标签: haskell

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

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

2 个答案:

答案 0 :(得分:4)

WAI Middleware只是对Application的转换:

type Middleware = Application -> Application

Application只是一个处理程序:

type Application = Request -> (Response -> IO ResponseReceived) -> IO ResponseReceived

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

-- 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

请记住,我编写此代码时无法访问ghc。这可能不完全正确。

答案 1 :(得分:0)

此功能是从outputs('Compose')[1]['key4']包中提供的。

wai-extra

示例输出:

{-# LANGUAGE OverloadedStrings #-}

import Web.Scotty
import Network.HTTP.Types
import Network.Wai.Middleware.RequestLogger

main = scotty 3000 $ do
  middleware logStdoutDev
  get "/" $ do
    text "example"