Aug. 17th, 2013

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

Profile

yorool_gui: (Default)
Michael Ilyin

April 2017

S M T W T F S
      1
2 345678
910 1112131415
16171819202122
23242526272829
30      

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 25th, 2025 12:40 am
Powered by Dreamwidth Studios