module Network.Wai.Handler.Warp.Settings where
import Control.Exception
import qualified Data.ByteString as S
import qualified Data.ByteString.Char8 as S8
import Data.Conduit
import Data.Conduit.Network (HostPreference (HostIPv4))
import GHC.IO.Exception (IOErrorType(..))
import Network.Wai
import Network.Wai.Handler.Warp.Timeout
import Network.Wai.Handler.Warp.Types
import System.IO (hPrint, stderr)
import System.IO.Error (ioeGetErrorType)
data Settings = Settings
{ settingsPort :: Int
, settingsHost :: HostPreference
, settingsOnException :: SomeException -> IO ()
, settingsOnOpen :: IO ()
, settingsOnClose :: IO ()
, settingsTimeout :: Int
, settingsIntercept :: Request -> Maybe (Source (ResourceT IO) S.ByteString -> Connection -> ResourceT IO ())
, settingsManager :: Maybe Manager
, settingsFdCacheDuration :: Int
, settingsResourceTPerRequest :: Bool
, settingsBeforeMainLoop :: IO ()
, settingsServerName :: S.ByteString
}
defaultSettings :: Settings
defaultSettings = Settings
{ settingsPort = 3000
, settingsHost = HostIPv4
, settingsOnException = defaultExceptionHandler
, settingsOnOpen = return ()
, settingsOnClose = return ()
, settingsTimeout = 30
, settingsIntercept = const Nothing
, settingsManager = Nothing
, settingsFdCacheDuration = 10
, settingsResourceTPerRequest = True
, settingsBeforeMainLoop = return ()
, settingsServerName = S8.pack $ "Warp/" ++ warpVersion
}
defaultExceptionHandler :: SomeException -> IO ()
defaultExceptionHandler e = throwIO e `catches` handlers
where
handlers = [Handler ah, Handler ih, Handler oh, Handler sh]
ah :: AsyncException -> IO ()
ah ThreadKilled = return ()
ah x = hPrint stderr x
ih :: InvalidRequest -> IO ()
ih _ = return ()
oh :: IOException -> IO ()
oh x
| et == ResourceVanished || et == InvalidArgument = return ()
| otherwise = hPrint stderr x
where
et = ioeGetErrorType x
sh :: SomeException -> IO ()
sh x = hPrint stderr x