module Network.Salvia.Handler.Close
( hCloseConn
, hKeepAlive
, emptyQueue
)
where
import Control.Monad.State
import Data.Maybe
import Data.Record.Label
import Network.Protocol.Http
import Network.Salvia.Interface
import Network.Salvia.Handler.Error
import System.IO
hCloseConn :: (HandleM m, MonadIO m) => m a -> m ()
hCloseConn h = h >> handle >>= flip catchIO () . hClose
hKeepAlive :: (QueueM m, HandleM m, HttpM' m, MonadIO m) => m a -> m ()
hKeepAlive handler =
do _ <- handler
h <- handle
conn <- request (getM connection)
ver <- request (getM version)
len <- response (getM contentLength)
closed <- liftIO (hIsClosed h)
if or [ closed
, conn == Just "Close"
, isNothing (len :: Maybe Integer)
, ver == http10
]
then catchIO (hClose h) ()
else resetContext >> hKeepAlive handler
resetContext :: (HttpM' m, QueueM m) => m ()
resetContext =
do request (put emptyRequest)
response (put emptyResponse)
emptyQueue
emptyQueue :: QueueM m => m ()
emptyQueue = dequeue >>= return () `maybe` const emptyQueue