2013-05-02 40 views
10

我目前從Network.Wai.Middleware.RequestLogger運行中間件logStdoutDev,但它只記錄路徑和Accept頭(可能還有其他頭文件)。我也想看到POST和PUT請求的主體。這個機構恰好是json,所以只需將它打印到stdout就可以。如何在WAI/scotty中記錄整個HTTP請求?

我已經搜索了一個WAI中間件,記錄了一切,但沒有找到任何。我對WAI的內部知識並不十分了解,所以我寫了一些提取POST body並將其放回自己的內容,所以我希望現在能夠避免這種學習曲線。

+0

我目前只是在每個路由處理器中使用「body >> = liftIO。putStrLn。show」,但這顯然不是DRY。我想早一點做。 – Gurgeh 2013-05-02 13:11:08

回答

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。這可能不完全正確。