{-# LANGUAGE FlexibleContexts #-}
module Network.Salvia.Handler.Environment
( hDefaultEnv
, hEnvNoKeepAlive
)
where

import Control.Monad.State
import Network.Protocol.Http
import Network.Salvia.Interface
import Network.Salvia.Handler.Banner
import Network.Salvia.Handler.Close
import Network.Salvia.Handler.Error
import Network.Salvia.Handler.Head
import Network.Salvia.Handler.Parser
import Network.Salvia.Handler.Printer
import Prelude hiding (log)

{- |
This is the default handler environment. It takes care of request parsing
(`hRequestParser`), response printing (`hResponsePrinter`), connection
keep-alives (`hKeepAlive`), handling `HEAD` requests (`hHead`) and printing the
`salvia-httpd` server banner (`hBanner`). 
-}

hDefaultEnv
  :: (MonadIO m, HandleM m, RawHttpM' m, HttpM' m, QueueM m, SendM m, FlushM Response m)
  => m ()  -- ^ Handler to run in the default environment.
  -> m ()
hDefaultEnv handler =
  hKeepAlive $ 
    do hBanner "salvia-httpd"
       _ <- hRequestParser (1000 * 4)
         (hCustomError BadRequest)
         (hHead handler)
       hResponsePrinter

-- | Like `hDefaultEnv' but only serves one request per connection.

hEnvNoKeepAlive
  :: (MonadIO m, HandleM m, RawHttpM' m, HttpM' m, QueueM m, SendM m, FlushM Response m)
  => m ()  -- ^ Handler to run in this environment.
  -> m ()
hEnvNoKeepAlive handler =
  do hBanner "salvia-httpd"
     _ <- hRequestParser (1000 * 4)
       (hCustomError BadRequest)
       (hHead handler)
     hResponsePrinter