, ResTree
, mkResTree -- [ ([String], ResourceDef) ] -> ResTree
- , findResource -- ResTree -> URI -> Maybe ResourceDef
+ , findResource -- ResTree -> URI -> Maybe ([String], ResourceDef)
, runResource -- ResourceDef -> Interaction -> IO ThreadId
)
where
import Data.Maybe
import Network.HTTP.Lucu.Abortion
import Network.HTTP.Lucu.Config
+import Network.HTTP.Lucu.MIMEType
import Network.HTTP.Lucu.Request
import Network.HTTP.Lucu.Resource
import Network.HTTP.Lucu.Response
subtree
-findResource :: ResTree -> URI -> Maybe ResourceDef
+findResource :: ResTree -> URI -> Maybe ([String], ResourceDef)
findResource (ResNode rootDefM subtree) uri
= let pathStr = uriPath uri
path = [x | x <- splitBy (== '/') pathStr, x /= ""]
in
if null path then
- rootDefM
+ do def <- rootDefM
+ return (path, def)
else
- walkTree subtree path
+ walkTree subtree path []
where
- walkTree :: ResSubtree -> [String] -> Maybe ResourceDef
+ walkTree :: ResSubtree -> [String] -> [String] -> Maybe ([String], ResourceDef)
- walkTree subtree (name:[])
+ walkTree subtree (name:[]) soFar
= case M.lookup name subtree of
Nothing -> Nothing
- Just (ResNode defM _) -> defM
+ Just (ResNode defM _) -> do def <- defM
+ return (soFar ++ [name], def)
- walkTree subtree (x:xs)
+ walkTree subtree (x:xs) soFar
= case M.lookup x subtree of
Nothing -> Nothing
Just (ResNode defM children) -> case defM of
Just (ResourceDef { resIsGreedy = True })
- -> defM
- _ -> walkTree children xs
+ -> do def <- defM
+ return (soFar ++ [x], def)
+ _ -> walkTree children xs (soFar ++ [x])
runResource :: ResourceDef -> Interaction -> IO ThreadId
-- FIXME: 同じ名前で複數の値があった時は、こ
-- れではまずいと思ふ。
mapM_ (\ (name, value) -> setHeader name value) $ aboHeaders abo
- setHeader "Content-Type" "application/xhtml+xml"
+ setContentType ("application" +/+ "xhtml+xml")
output $ abortPage conf reqM resM abo
else
hPutStrLn stderr $ show abo