Switched some code to MonadAttempt

This commit is contained in:
Michael Snoyman 2009-10-21 00:57:54 +02:00
parent 971d05050c
commit d081f6f516
4 changed files with 31 additions and 17 deletions

View File

@ -36,6 +36,7 @@ import Web.Restful.Request
import Web.Restful.Response import Web.Restful.Response
import Control.Monad.Trans import Control.Monad.Trans
import Control.Monad.Attempt.Class
import Control.Monad (liftM, ap) import Control.Monad (liftM, ap)
import Control.Applicative import Control.Applicative
@ -131,6 +132,9 @@ instance Monad m => MonadRequestReader (HandlerT m) where
errorResult $ InvalidArgs [(name ++ " (" ++ show ptype ++ ")", msg)] errorResult $ InvalidArgs [(name ++ " (" ++ show ptype ++ ")", msg)]
authRequired = errorResult PermissionDenied authRequired = errorResult PermissionDenied
instance Monad m => MonadAttempt (HandlerT m) where
failure = errorResult . InternalError . show
------ Special handlers ------ Special handlers
errorResult :: Monad m => ErrorResult -> HandlerT m a errorResult :: Monad m => ErrorResult -> HandlerT m a
errorResult er = HandlerT (const $ return (Left er, [])) errorResult er = HandlerT (const $ return (Left er, []))

View File

@ -31,8 +31,10 @@ import Web.Restful.Constants
import Control.Applicative ((<$>), Applicative (..)) import Control.Applicative ((<$>), Applicative (..))
import Control.Monad.Reader import Control.Monad.Reader
import Control.Monad.Attempt
import Data.Maybe (fromMaybe) import Data.Maybe (fromMaybe)
import Data.Attempt
data AuthResource = data AuthResource =
Check Check
@ -104,21 +106,21 @@ authOpenidForward = do
let complete = "http://" ++ Hack.serverName env ++ ":" ++ let complete = "http://" ++ Hack.serverName env ++ ":" ++
show (Hack.serverPort env) ++ show (Hack.serverPort env) ++
"/auth/openid/complete/" "/auth/openid/complete/"
res <- liftIO $ OpenId.getForwardUrl oid complete res <- runAttemptT $ OpenId.getForwardUrl oid complete
case res of case res of
Left err -> redirect $ "/auth/openid/?message=" Failure err -> redirect $ "/auth/openid/?message="
++ encodeUrl (err :: String) ++ encodeUrl (show err)
Right url -> redirect url Success url -> redirect url
authOpenidComplete :: Handler authOpenidComplete :: Handler
authOpenidComplete = do authOpenidComplete = do
gets' <- rawGetParams <$> askRawRequest gets' <- rawGetParams <$> askRawRequest
dest <- cookieParam "DEST" dest <- cookieParam "DEST"
res <- liftIO $ OpenId.authenticate gets' res <- runAttemptT $ OpenId.authenticate gets'
case res of case res of
Left err -> redirect $ "/auth/openid/?message=" Failure err -> redirect $ "/auth/openid/?message="
++ encodeUrl (err :: String) ++ encodeUrl (show err)
Right (OpenId.Identifier ident) -> do Success (OpenId.Identifier ident) -> do
deleteCookie "DEST" deleteCookie "DEST"
header authCookieName ident header authCookieName ident
redirect $ fromMaybe "/" dest redirect $ fromMaybe "/" dest
@ -148,7 +150,7 @@ rpxnowLogin apiKey = do
Just "" -> "/" Just "" -> "/"
Just ('#':rest) -> rest Just ('#':rest) -> rest
Just s -> s Just s -> s
ident <- join $ liftIO $ Rpxnow.authenticate apiKey token ident <- Rpxnow.authenticate apiKey token
header authCookieName $ Rpxnow.identifier ident header authCookieName $ Rpxnow.identifier ident
redirect dest redirect dest

View File

@ -1,5 +1,4 @@
{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE OverlappingInstances #-} {-# LANGUAGE OverlappingInstances #-}
--------------------------------------------------------- ---------------------------------------------------------
-- --
@ -50,7 +49,6 @@ module Web.Restful.Request
import qualified Hack import qualified Hack
import Data.Function.Predicate (equals) import Data.Function.Predicate (equals)
import Control.Monad.Error ()
import Web.Restful.Constants import Web.Restful.Constants
import Web.Restful.Utils import Web.Restful.Utils
import Control.Applicative (Applicative (..)) import Control.Applicative (Applicative (..))
@ -275,9 +273,17 @@ instance Parameter a => Parameter (Maybe a) where
" values, expecting 0 or 1" " values, expecting 0 or 1"
instance Parameter a => Parameter [a] where instance Parameter a => Parameter [a] where
readParams = mapM readParam readParams = mapM' readParam where
mapM' f = sequence' . map f
sequence' :: [Either String v] -> Either String [v]
sequence' [] = Right []
sequence' (Left l:_) = Left l
sequence' (Right r:rest) =
case sequence' rest of
Left l -> Left l
Right rest' -> Right $ r : rest'
instance Parameter String where instance Parameter [Char] where
readParam = Right . paramValue readParam = Right . paramValue
instance Parameter Int where instance Parameter Int where

View File

@ -1,5 +1,5 @@
name: restful name: restful
version: 0.1.8 version: 0.1.9
license: BSD3 license: BSD3
license-file: LICENSE license-file: LICENSE
author: Michael Snoyman <michael@snoyman.com> author: Michael Snoyman <michael@snoyman.com>
@ -22,13 +22,12 @@ library
hack-handler-cgi >= 0.0.2, hack-handler-cgi >= 0.0.2,
hack >= 2009.5.19, hack >= 2009.5.19,
split >= 0.1.1, split >= 0.1.1,
authenticate >= 0.0.1, authenticate >= 0.2.0,
data-default >= 0.2, data-default >= 0.2,
predicates >= 0.1, predicates >= 0.1,
bytestring >= 0.9.1.4, bytestring >= 0.9.1.4,
bytestring-class, bytestring-class,
web-encodings >= 0.0.1, web-encodings >= 0.0.1,
mtl >= 1.1.0.2,
data-object >= 0.2.0, data-object >= 0.2.0,
yaml >= 0.2.0, yaml >= 0.2.0,
test-framework, test-framework,
@ -37,7 +36,10 @@ library
HUnit, HUnit,
QuickCheck == 1.*, QuickCheck == 1.*,
enumerable >= 0.0.3, enumerable >= 0.0.3,
directory >= 1 directory >= 1,
transformers >= 0.1.4.0,
monads-fd >= 0.0.0.1,
attempt
exposed-modules: Web.Restful, exposed-modules: Web.Restful,
Web.Restful.Constants, Web.Restful.Constants,
Web.Restful.Request, Web.Restful.Request,