--- #prune
+{-# OPTIONS_HADDOCK prune #-}
-- | Repository of the resources in httpd.
module Network.HTTP.Lucu.Resource.Tree
import Control.Exception
import Control.Monad
import qualified Data.ByteString.Char8 as C8
-import Data.Dynamic
import Data.List
import qualified Data.Map as M
import Data.Map (Map)
import Network.HTTP.Lucu.Response
import Network.HTTP.Lucu.Interaction
import Network.HTTP.Lucu.Utils
-import Network.URI
+import Network.URI hiding (path)
import System.IO
import System.IO.Error hiding (catch)
import Prelude hiding (catch)
-- ]
-- @
mkResTree :: [ ([String], ResourceDef) ] -> ResTree
-mkResTree list = list `seq` processRoot list
+mkResTree xs = xs `seq` processRoot xs
where
processRoot :: [ ([String], ResourceDef) ] -> ResTree
processRoot list
where
walkTree :: ResSubtree -> [String] -> [String] -> Maybe ([String], ResourceDef)
- walkTree subtree (name:[]) soFar
- = case M.lookup name subtree of
+ walkTree _ [] _
+ = error "Internal error: should not reach here."
+
+ walkTree tree (name:[]) soFar
+ = case M.lookup name tree of
Nothing -> Nothing
Just (ResNode defM _) -> do def <- defM
return (soFar ++ [name], def)
- walkTree subtree (x:xs) soFar
- = case M.lookup x subtree of
+ walkTree tree (x:xs) soFar
+ = case M.lookup x tree of
Nothing -> Nothing
Just (ResNode defM children) -> case defM of
Just (ResourceDef { resIsGreedy = True })
POST -> resPost def
PUT -> resPut def
DELETE -> resDelete def
+ _ -> undefined
notAllowed :: Resource ()
notAllowed = do setStatus MethodNotAllowed
Just _ -> xs
Nothing -> []
- processException :: Exception -> IO ()
+ toAbortion :: SomeException -> Abortion
+ toAbortion e = case fromException e of
+ Just abortion -> abortion
+ Nothing -> Abortion InternalServerError emptyHeaders (Just (show e))
+
+ processException :: SomeException -> IO ()
processException exc
- = do let abo = case exc of
- ErrorCall msg -> Abortion InternalServerError emptyHeaders $ Just msg
- IOException ioE -> Abortion InternalServerError emptyHeaders $ Just $ formatIOE ioE
- DynException dynE -> case fromDynamic dynE of
- Just (abo :: Abortion) -> abo
- Nothing
- -> Abortion InternalServerError emptyHeaders
- $ Just $ show exc
- _ -> Abortion InternalServerError emptyHeaders $ Just $ show exc
+ = do let abo = toAbortion exc
conf = itrConfig itr
-- まだ DecidingHeader 以前の状態だったら、この途中終了
-- を應答に反映させる餘地がある。さうでなければ stderr