Как я могу зарегистрировать весь HTTP-запрос в WAI/scotty?

В настоящее время я запускаю middleware logStdoutDev из Network.Wai.Middleware.RequestLogger, но он регистрирует только путь и заголовок Accept (возможно, другие заголовки тоже). Я хочу видеть тело запросов POST и PUT. Это тело, как правило, json, поэтому просто печатать его на stdout будет хорошо.

Я искал промежуточное ПО WAI, которое регистрирует все, но не нашел. Я не знаю достаточно о WAI внутренности, чтобы написать что-то, что извлекает тело POST, а затем возвращает его в себя, поэтому я надеялся избежать этой кривой обучения прямо сейчас.

Ответ 1

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. Это может быть не совсем правильно.