packages feed

salvia-0.0.4: src/Network/Salvia/Handlers/Log.hs

module Network.Salvia.Handlers.Log (hLog) where

import Control.Concurrent.STM
import Control.Monad.State
import System.IO

import Network.Salvia.Httpd  (Handler, request, response, address)
import Network.Protocol.Http
import Misc.Terminal (red, green, reset)

-- TODO: handle should be tvar as well
hLog :: TVar Int -> Handle -> Handler Handle
hLog count handle = do
  c    <- lift $ atomically $ readTVar count
  req  <- gets request
  res  <- gets response
  addr <- gets address
  let st   = status res
      code = codeFromStatus st
      clr  = if code >= 400 then red else green
  lift $ hPutStrLn handle $ concat [
      concat ["[", show addr, "] ", show c, "\t"]
    , show $ method req, "\t"
    , show $ uri req , " -> "
    , clr
    , show code, " "
    , show st
    , reset
    ]
  return handle