Ну почему стоит начать делать минимально реальный проект на Happstack - и уже надо писать свой монадный трансформер? За что мне этот кошмар?
Конкретно проблема в том, что мне хочется мерить время обработки каждого http вызова. Я сделал вот такую функцию
measureNamed :: TVar DStatus -> B.ByteString -> ServerPart Response -> ServerPart Response
Конкретно проблема в том, что мне хочется мерить время обработки каждого http вызова. Я сделал вот такую функцию
measureNamed :: TVar DStatus -> B.ByteString -> ServerPart Response -> ServerPart Response
measureNamed dstatusVar page action = do
dstatus <- lift $ readTVarIO dstatusVar
start <- lift getCurrentTime
resp <- action
stop <- resp `seq` (lift getCurrentTime)
let time = diffUTCTime stop start
lift $ atomically $ modifyTVar dstatusVar $ measureVisit page time
return resp
которую исползьзую так
где в переменной dvar типа TVar DStatus хранятся данные о времени исполнения. И тут оказалось, что если я в action пользуюсь функцией finishWith, то и из measure я тоже вылетаю досрочно и ничего в TVar не пишу.
Решение похоже есть - функция mapServerPartT, которая позволит обернуть моей измеряющей функцией все обработчики. Но блин, мой моск ее уже сегодня не переваривает.
которую исползьзую так
simpleHTTP conf $ msum [
dir "dstatus" $ measure dvar $ dstatusAction acidStats dvar,
dir "favicon.ico" $ measure dvar $ serveFile (asContentType "image/vnd.microsoft.icon") "favicon.ico",
dir "static" $ measure dvar $ serveDirectory EnableBrowsing [] "html"
]
где в переменной dvar типа TVar DStatus хранятся данные о времени исполнения. И тут оказалось, что если я в action пользуюсь функцией finishWith, то и из measure я тоже вылетаю досрочно и ничего в TVar не пишу.
Решение похоже есть - функция mapServerPartT, которая позволит обернуть моей измеряющей функцией все обработчики. Но блин, мой моск ее уже сегодня не переваривает.