module Web.Respond.DefaultHandlers where
import Control.Applicative ((<$>))
import Network.Wai
import qualified Data.ByteString as BS
import Network.HTTP.Types.Status
import Network.HTTP.Types.Method
import Web.Respond.Types
import Web.Respond.Monad
import Web.Respond.Response
defaultHandlers :: FailureHandlers
defaultHandlers = FailureHandlers {
_unsupportedMethod = defaultUnsupportedMethodHandler,
_unmatchedPath = defaultUnmatchedPathHandler,
_bodyParseFailed = defaultBodyParseFailureHandler,
_authFailed = defaultAuthFailedHandler,
_accessDenied = defaultAccessDeniedHandler,
_caughtException = defaultCaughtExceptionHandler,
_unacceptableResponse = defaultUnacceptableResponseHandler
}
defaultUnsupportedMethodHandler :: MonadRespond m => [StdMethod] -> Method -> m ResponseReceived
defaultUnsupportedMethodHandler allowed = const $ respondEmptyBody methodNotAllowed405 [("Allowed", allowedStr allowed)]
where allowedStr mths = BS.intercalate ", " (renderStdMethod <$> mths)
defaultUnmatchedPathHandler :: MonadRespond m => m ResponseReceived
defaultUnmatchedPathHandler = respondEmptyBody notFound404 []
defaultBodyParseFailureHandler :: (MonadRespond m, ReportableError e) => e -> m ResponseReceived
defaultBodyParseFailureHandler = respondReportError badRequest400 []
defaultAuthFailedHandler :: (MonadRespond m, ReportableError e) => e -> m ResponseReceived
defaultAuthFailedHandler = respondReportError unauthorized401 []
defaultAccessDeniedHandler :: (MonadRespond m, ReportableError e) => e -> m ResponseReceived
defaultAccessDeniedHandler = respondReportError forbidden403 []
defaultCaughtExceptionHandler :: (MonadRespond m, ReportableError e) => e -> m ResponseReceived
defaultCaughtExceptionHandler = respondReportError internalServerError500 []
defaultUnacceptableResponseHandler :: MonadRespond m => m ResponseReceived
defaultUnacceptableResponseHandler = respondEmptyBody notAcceptable406 []