Switched some code to MonadAttempt
This commit is contained in:
parent
971d05050c
commit
d081f6f516
@ -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, []))
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user