2013-05-02 2 views
10

Tôi hiện đang chạy phần mềm trung gian logStdoutDev từ Network.Wai.Middleware.RequestLogger, nhưng nó chỉ ghi lại đường dẫn và tiêu đề Chấp nhận (cũng có thể là các tiêu đề khác). Tôi cũng muốn thấy cơ thể của các yêu cầu POST và PUT. Cơ thể này xảy ra là json, vì vậy chỉ cần in nó để stdout sẽ làm tốt.Làm thế nào tôi có thể đăng nhập toàn bộ yêu cầu HTTP trong WAI/scotty?

Tôi đã tìm kiếm một phần mềm trung gian WAI ghi nhật ký mọi thứ nhưng không tìm thấy bất kỳ phần mềm nào. Tôi không thực sự biết đủ về WAI internals để viết cái gì đó chiết xuất POST cơ thể và sau đó đặt nó trở lại trong bản thân mình, vì vậy tôi đã hy vọng để tránh đường cong học tập ngay bây giờ.

+0

Tôi hiện đang chỉ sử dụng "body >> = liftIO. PutStrLn. Hiển thị" trong mỗi trình xử lý tuyến đường, nhưng điều này rõ ràng là không KHÔ. Tôi muốn làm điều đó một bước trước đó. – Gurgeh

Trả lời

4

WAI Middleware chỉ là một sự chuyển đổi qua Application:

type Middleware = Application -> Application 

Application chỉ là một handler:

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

Tất cả bạn cần làm là xác định xử lý đó sẽ đăng nhập bất cứ điều gì bạn muốn và đại biểu "công việc thực tế" ở hạ lưu:

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

Xin lưu ý rằng tôi đã viết mã này mà không cần truy cập vào ghc. Nó có thể không hoàn toàn chính xác.