module Network.Wai.Handler.Warp.Settings where
import Control.Exception
import qualified Data.ByteString as S
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 :: Maybe Request -> SomeException -> IO ()
, settingsOnOpen :: IO ()
, settingsOnClose :: IO ()
, settingsTimeout :: Int
, settingsIntercept :: Request -> Maybe (Source IO S.ByteString -> Connection -> IO ())
, settingsManager :: Maybe Manager
, settingsFdCacheDuration :: Int
, settingsBeforeMainLoop :: IO ()
}
defaultSettings :: Settings
defaultSettings = Settings
{ settingsPort = 3000
, settingsHost = HostIPv4
, settingsOnException = defaultExceptionHandler
, settingsOnOpen = return ()
, settingsOnClose = return ()
, settingsTimeout = 30
, settingsIntercept = const Nothing
, settingsManager = Nothing
, settingsFdCacheDuration = 10
, settingsBeforeMainLoop = return ()
}
defaultExceptionHandler :: Maybe Request -> 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