Fixed some FIXMEs
This commit is contained in:
parent
ab233514e1
commit
4e30f53746
@ -1,7 +1,7 @@
|
|||||||
{-# LANGUAGE ExistentialQuantification #-}
|
{-# LANGUAGE ExistentialQuantification #-}
|
||||||
{-# LANGUAGE MultiParamTypeClasses #-}
|
{-# LANGUAGE MultiParamTypeClasses #-}
|
||||||
{-# LANGUAGE FlexibleInstances #-}
|
{-# LANGUAGE FlexibleInstances #-}
|
||||||
{-# LANGUAGE TypeSynonymInstances #-} -- FIXME remove
|
{-# LANGUAGE TypeSynonymInstances #-}
|
||||||
{-# LANGUAGE FlexibleContexts #-}
|
{-# LANGUAGE FlexibleContexts #-}
|
||||||
{-# LANGUAGE PackageImports #-}
|
{-# LANGUAGE PackageImports #-}
|
||||||
---------------------------------------------------------
|
---------------------------------------------------------
|
||||||
@ -105,7 +105,6 @@ runHandler (Handler handler) eh rr y cts = do
|
|||||||
HCContent a -> Right a
|
HCContent a -> Right a
|
||||||
case contents' of
|
case contents' of
|
||||||
Left e -> do
|
Left e -> do
|
||||||
-- FIXME doesn't look right
|
|
||||||
Response _ hs ct c <- runHandler (eh e) specialEh rr y cts
|
Response _ hs ct c <- runHandler (eh e) specialEh rr y cts
|
||||||
let hs' = headers ++ hs ++ getHeaders e
|
let hs' = headers ++ hs ++ getHeaders e
|
||||||
return $ Response (getStatus e) hs' ct c
|
return $ Response (getStatus e) hs' ct c
|
||||||
@ -117,84 +116,6 @@ specialEh :: ErrorResult -> Handler yesod RepChooser
|
|||||||
specialEh er = do
|
specialEh er = do
|
||||||
liftIO $ hPutStrLn stderr $ "Error handler errored out: " ++ show er
|
liftIO $ hPutStrLn stderr $ "Error handler errored out: " ++ show er
|
||||||
return $ chooseRep $ toHtmlObject "Internal server error"
|
return $ chooseRep $ toHtmlObject "Internal server error"
|
||||||
{- FIXME
|
|
||||||
class ToHandler a where
|
|
||||||
toHandler :: a -> Handler
|
|
||||||
|
|
||||||
instance (Request r, ToHandler h) => ToHandler (r -> h) where
|
|
||||||
toHandler f = parseRequest >>= toHandler . f
|
|
||||||
|
|
||||||
instance ToHandler Handler where
|
|
||||||
toHandler = id
|
|
||||||
|
|
||||||
instance HasReps r HandlerIO => ToHandler (HandlerIO r) where
|
|
||||||
toHandler = fmap reps
|
|
||||||
|
|
||||||
runHandler :: Handler
|
|
||||||
-> RawRequest
|
|
||||||
-> [ContentType]
|
|
||||||
-> IO (Either (ErrorResult, [Header]) Response)
|
|
||||||
runHandler h rr cts = do
|
|
||||||
--let (ares, _FIXMEheaders) =
|
|
||||||
let x :: IO (Attempt (ContentType, Content), [Header])
|
|
||||||
x =
|
|
||||||
runWriterT $ runAttemptT $ runReaderT (joinHandler cts h) rr
|
|
||||||
y :: IO (Attempt (Attempt (ContentType, Content), [Header]))
|
|
||||||
y = takeAllExceptions x
|
|
||||||
z <- y
|
|
||||||
let z' :: Attempt (Attempt (ContentType, Content), [Header])
|
|
||||||
z' = z
|
|
||||||
a :: (Attempt (ContentType, Content), [Header])
|
|
||||||
a = attempt (\e -> (failure e, [])) id z'
|
|
||||||
(b, headers) = a
|
|
||||||
return $ attempt (\e -> (Left (toErrorResult e, headers))) (Right . toResponse headers) b
|
|
||||||
where
|
|
||||||
takeAllExceptions :: MonadFailure SomeException m => IO x -> IO (m x)
|
|
||||||
takeAllExceptions ioa =
|
|
||||||
Control.Exception.catch (return `fmap` ioa) (\e -> return $ failure (e :: SomeException))
|
|
||||||
toErrorResult :: Exception e => e -> ErrorResult
|
|
||||||
toErrorResult e =
|
|
||||||
case cast e of
|
|
||||||
Just x -> x
|
|
||||||
Nothing -> InternalError $ show e
|
|
||||||
toResponse :: [Header] -> (ContentType, Content) -> Response
|
|
||||||
toResponse hs (ct, c) = Response 200 hs ct c
|
|
||||||
|
|
||||||
joinHandler :: Monad m
|
|
||||||
=> [ContentType]
|
|
||||||
-> m [RepT m]
|
|
||||||
-> m (ContentType, Content)
|
|
||||||
joinHandler cts rs = do
|
|
||||||
rs' <- rs
|
|
||||||
let (ct, c) = chooseRep cts rs'
|
|
||||||
c' <- c
|
|
||||||
return (ct, c')
|
|
||||||
-}
|
|
||||||
|
|
||||||
{-
|
|
||||||
runHandler :: (ErrorResult -> Reps)
|
|
||||||
-> (ContentType -> B.ByteString -> IO B.ByteString)
|
|
||||||
-> [ContentType]
|
|
||||||
-> Handler
|
|
||||||
-> RawRequest
|
|
||||||
-> IO Hack.Response
|
|
||||||
runHandler eh wrapper ctypesAll (HandlerT inside) rr = do
|
|
||||||
let extraHeaders =
|
|
||||||
case x of
|
|
||||||
Left r -> getHeaders r
|
|
||||||
Right _ -> []
|
|
||||||
headers <- mapM toPair (headers' ++ extraHeaders)
|
|
||||||
let outReps = either (reps . eh) reps x
|
|
||||||
let statusCode =
|
|
||||||
case x of
|
|
||||||
Left r -> getStatus r
|
|
||||||
Right _ -> 200
|
|
||||||
(ctype, selectedRep) <- chooseRep outReps ctypesAll
|
|
||||||
let languages = [] -- FIXME
|
|
||||||
finalRep <- wrapper ctype $ selectedRep languages
|
|
||||||
let headers'' = ("Content-Type", ctype) : headers
|
|
||||||
return $! Hack.Response statusCode headers'' finalRep
|
|
||||||
-}
|
|
||||||
|
|
||||||
------ Special handlers
|
------ Special handlers
|
||||||
errorResult :: ErrorResult -> Handler yesod a
|
errorResult :: ErrorResult -> Handler yesod a
|
||||||
|
|||||||
@ -62,6 +62,7 @@ import Test.Framework.Providers.QuickCheck (testProperty)
|
|||||||
import Test.HUnit hiding (Test)
|
import Test.HUnit hiding (Test)
|
||||||
import Test.QuickCheck
|
import Test.QuickCheck
|
||||||
import Control.Monad (when)
|
import Control.Monad (when)
|
||||||
|
import Data.Typeable
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
resources :: QuasiQuoter
|
resources :: QuasiQuoter
|
||||||
@ -187,7 +188,7 @@ overlaps (Static a:x) (Static b:y) = a == b && overlaps x y
|
|||||||
|
|
||||||
data OverlappingPatterns =
|
data OverlappingPatterns =
|
||||||
OverlappingPatterns [(ResourcePattern, ResourcePattern)]
|
OverlappingPatterns [(ResourcePattern, ResourcePattern)]
|
||||||
deriving (Show, Typeable)
|
deriving (Show, Typeable, Eq)
|
||||||
instance Exception OverlappingPatterns
|
instance Exception OverlappingPatterns
|
||||||
|
|
||||||
getAllPairs :: [x] -> [(x, x)]
|
getAllPairs :: [x] -> [(x, x)]
|
||||||
@ -394,7 +395,7 @@ testSuite = testGroup "Yesod.Resource"
|
|||||||
[ testCase "non-overlap" caseOverlap1
|
[ testCase "non-overlap" caseOverlap1
|
||||||
, testCase "overlap" caseOverlap2
|
, testCase "overlap" caseOverlap2
|
||||||
, testCase "overlap-slurp" caseOverlap3
|
, testCase "overlap-slurp" caseOverlap3
|
||||||
-- FIXME, testCase "validatePatterns" caseValidatePatterns
|
, testCase "checkPatterns" caseCheckPatterns
|
||||||
, testProperty "show pattern" prop_showPattern
|
, testProperty "show pattern" prop_showPattern
|
||||||
, testCase "integers" caseIntegers
|
, testCase "integers" caseIntegers
|
||||||
, testCase "read patterns from YAML" caseFromYaml
|
, testCase "read patterns from YAML" caseFromYaml
|
||||||
@ -424,19 +425,24 @@ caseOverlap2 = caseOverlap' "/foo/bar" "/foo/$baz" True
|
|||||||
caseOverlap3 :: Assertion
|
caseOverlap3 :: Assertion
|
||||||
caseOverlap3 = caseOverlap' "/foo/bar/baz/$bin" "*slurp" True
|
caseOverlap3 = caseOverlap' "/foo/bar/baz/$bin" "*slurp" True
|
||||||
|
|
||||||
{- FIXME rewrite this test
|
caseCheckPatterns :: Assertion
|
||||||
caseValidatePatterns :: Assertion
|
caseCheckPatterns = do
|
||||||
caseValidatePatterns =
|
let res = checkPatterns [p1, p2, p3, p4, p5]
|
||||||
let p1 = cs "/foo/bar/baz"
|
attempt helper (fail "Did not fail") res
|
||||||
p2 = cs "/foo/$bar/baz"
|
where
|
||||||
p3 = cs "/bin"
|
p1 = cs "/foo/bar/baz"
|
||||||
p4 = cs "/bin/boo"
|
p2 = cs "/foo/$bar/baz"
|
||||||
p5 = cs "/bin/*slurp"
|
p3 = cs "/bin"
|
||||||
in validatePatterns [p1, p2, p3, p4, p5] @?= Just
|
p4 = cs "/bin/boo"
|
||||||
[ (p1, p2)
|
p5 = cs "/bin/*slurp"
|
||||||
, (p4, p5)
|
expected = OverlappingPatterns
|
||||||
]
|
[ (p1, p2)
|
||||||
-}
|
, (p4, p5)
|
||||||
|
]
|
||||||
|
helper e = case cast e of
|
||||||
|
Nothing -> fail "Wrong exception"
|
||||||
|
Just op -> do
|
||||||
|
expected @=? op
|
||||||
|
|
||||||
prop_showPattern :: RP -> Bool
|
prop_showPattern :: RP -> Bool
|
||||||
prop_showPattern p = readRP (cs p) == Just p
|
prop_showPattern p = readRP (cs p) == Just p
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user