--- #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.Utils
import Network.URI hiding (path)
import System.IO
-import System.IO.Error hiding (catch)
import Prelude hiding (catch)
where
walkTree :: ResSubtree -> [String] -> [String] -> Maybe ([String], ResourceDef)
+ walkTree _ [] _
+ = error "Internal error: should not reach here."
+
walkTree tree (name:[]) soFar
= case M.lookup name tree of
Nothing -> Nothing
driftTo Done
) itr
)
- $ \ exc -> processException exc
+ processException
where
fork :: IO () -> IO ThreadId
- fork = if (resUsesNativeThread def)
+ fork = if resUsesNativeThread def
then forkOS
else forkIO
setHeader (C8.pack "Allow") (C8.pack $ joinWith ", " allowedMethods)
allowedMethods :: [String]
- allowedMethods = nub $ foldr (++) [] [ methods resGet ["GET"]
- , methods resHead ["GET", "HEAD"]
- , methods resPost ["POST"]
- , methods resPut ["PUT"]
- , methods resDelete ["DELETE"]
- ]
+ allowedMethods = nub $ concat [ methods resGet ["GET"]
+ , methods resHead ["GET", "HEAD"]
+ , methods resPost ["POST"]
+ , methods resPut ["PUT"]
+ , methods resDelete ["DELETE"]
+ ]
methods :: (ResourceDef -> Maybe a) -> [String] -> [String]
methods f xs = case f def of
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 (a :: Abortion) -> a
- Nothing
- -> Abortion InternalServerError emptyHeaders
- $ Just $ show exc
- _ -> Abortion InternalServerError emptyHeaders $ Just $ show exc
+ = do let abo = toAbortion exc
conf = itrConfig itr
-- まだ DecidingHeader 以前の状態だったら、この途中終了
-- を應答に反映させる餘地がある。さうでなければ stderr
if state <= DecidingHeader then
flip runRes itr
$ do setStatus $ aboStatus abo
- mapM_ (\ (name, value) -> setHeader name value) $ fromHeaders $ aboHeaders abo
+ mapM_ (uncurry setHeader) $ fromHeaders $ aboHeaders abo
output $ abortPage conf reqM res abo
else
when (cnfDumpTooLateAbortionToStderr $ itrConfig itr)
$ hPutStrLn stderr $ show abo
flip runRes itr $ driftTo Done
-
- formatIOE :: IOError -> String
- formatIOE ioE = if isUserError ioE then
- ioeGetErrorString ioE
- else
- show ioE