packages feed

katip-wai-0.2.0.0: src/Katip/Wai/Response.hs

module Katip.Wai.Response
  ( Response (..)
  , traceResponse
  ) where

import Katip.Wai.Request (Request)
import qualified Katip.Wai.Request as Request

import Control.Monad.IO.Class (MonadIO (liftIO))
import qualified Data.Time as Time
import qualified Network.HTTP.Types as HttpTypes
import qualified Network.Wai as Wai
import qualified System.Clock as Clock


-- | Response that was sent back to client.
data Response = Response
  { status :: HttpTypes.Status
  -- ^ The HTTP status code of the response.
  , responseHeaders :: HttpTypes.ResponseHeaders
  -- ^ The headers in the response. Be careful not to log any sensntive headers.
  , respondedAt :: Time.UTCTime
  -- ^ The time server responded.
  , responseTime :: Clock.TimeSpec
  -- ^ How long it took the server to respond.
  }
  deriving (Show, Eq)


-- | Trace a response and time how long it took to process a request.
traceResponse :: MonadIO m => Request -> Wai.Response -> m Response
traceResponse request response = do
  endedAt <- liftIO $ Clock.getTime Clock.Monotonic
  respondedAt <- liftIO Time.getCurrentTime

  let responseTime = endedAt `Clock.diffTimeSpec` Request.startedAt request

  pure
    Response
      { status = Wai.responseStatus response
      , responseHeaders = Wai.responseHeaders response
      , respondedAt
      , responseTime
      }