diff --git a/Yesod/Handler.hs b/Yesod/Handler.hs index 1dcfa55d..b28c374c 100644 --- a/Yesod/Handler.hs +++ b/Yesod/Handler.hs @@ -28,6 +28,7 @@ module Yesod.Handler , redirect , notFound , permissionDenied + , invalidArgs -- * Setting headers , addCookie , deleteCookie @@ -81,8 +82,8 @@ instance Exception e => Failure e (Handler yesod) where failure e = Handler $ \_ -> return ([], HCError e) instance MonadRequestReader (Handler yesod) where askRawRequest = Handler $ \(rr, _) -> return ([], HCContent rr) - invalidParam _pt _pn _pe = error "invalidParam" - authRequired = error "authRequired" + invalidParam _pt pn pe = invalidArgs [(pn, pe)] + authRequired = permissionDenied getYesod :: Handler yesod yesod getYesod = Handler $ \(_, yesod) -> return ([], HCContent yesod) @@ -210,6 +211,9 @@ notFound = errorResult NotFound permissionDenied :: Handler yesod a permissionDenied = errorResult PermissionDenied +invalidArgs :: [(ParamName, ParamValue)] -> Handler yesod a +invalidArgs = errorResult . InvalidArgs + ------- Headers -- | Set the cookie on the client. addCookie :: Int -- ^ minutes to timeout diff --git a/test/errors.hs b/test/errors.hs new file mode 100644 index 00000000..b841f1ba --- /dev/null +++ b/test/errors.hs @@ -0,0 +1,43 @@ +{-# LANGUAGE QuasiQuotes #-} +import Yesod +import Hack +import Data.Default +import Data.List + +data Errors = Errors +instance Yesod Errors where + handlers = [$resources| +/denied: + Get: denied +/needs-ident: + Get: needsIdent +/has-args: + Get: hasArgs +|] + +denied :: Handler Errors () +denied = permissionDenied + +needsIdent :: Handler Errors HtmlObject +needsIdent = do + i <- identifier + return $ toHtmlObject i + +hasArgs :: Handler Errors HtmlObject +hasArgs = do + -- FIXME this test needs more work + a <- getParam "firstParam" + b <- getParam "secondParam" + return $ toHtmlObject [a :: String, b] + +main = do + let app = toHackApp Errors + res <- app $ def { pathInfo = "/denied/" } + print res + print $ "Permission denied" `isInfixOf` show res + res' <- app $ def { pathInfo = "/needs-ident/" } + print res' + print $ "Permission denied" `isInfixOf` show res' + res3 <- app $ def { pathInfo = "/has-args/" } + print res3 + print $ "secondParam" `isInfixOf` show res3