2013-08-17

yorool_gui: (лысый)
2013-08-17 10:11 pm

крик души

Ну почему стоит начать делать минимально реальный проект на Happstack - и уже надо писать свой монадный трансформер? За что мне этот кошмар?
Конкретно проблема в том, что мне хочется мерить время обработки каждого 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

которую исползьзую так

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, которая позволит обернуть моей измеряющей функцией все обработчики. Но блин, мой моск ее уже сегодня не переваривает.