X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=Rakka%2FResource%2FObject.hs;h=a18a268cb3504dc55badca12134cdf5883d02ed7;hb=e0da4e15d6a4053be720bddf62ae755f1f63ec3b;hp=9e30d1eee78d919f8094c10ab02adb886c78b0c4;hpb=790089d18791029ad268b3306ca71f8d5ae44ce1;p=Rakka.git diff --git a/Rakka/Resource/Object.hs b/Rakka/Resource/Object.hs index 9e30d1e..a18a268 100644 --- a/Rakka/Resource/Object.hs +++ b/Rakka/Resource/Object.hs @@ -3,20 +3,72 @@ module Rakka.Resource.Object ) where +import Data.ByteString.Char8 as C8 +import Data.Maybe import Network.HTTP.Lucu +import Network.HTTP.Lucu.Utils import Rakka.Environment +import Rakka.Page +import Rakka.Storage +import Rakka.SystemConfig +import System.Time resObject :: Environment -> ResourceDef resObject env = ResourceDef { resUsesNativeThread = False - , resIsGreedy = False - , resGet = Just $ do setContentType $ read "text/plain" - output "FIXME: not implemented" + , resIsGreedy = True + , resGet = Just $ getPathInfo >>= handleGet env . toPageName , resHead = Nothing , resPost = Nothing , resPut = Nothing , resDelete = Nothing } + where + toPageName :: [String] -> PageName + toPageName = decodePageName . joinWith "/" + + +handleGet :: Environment -> PageName -> Resource () +handleGet env name + = do pageM <- getPage (envStorage env) name Nothing + case pageM of + Nothing + -> foundNoEntity Nothing + + Just redir@(Redirection _ _ _ _) + -> handleRedirect env redir + + Just entity@(Entity _ _ _ _ _ _ _ _ _ _ _ _ _ _) + -> handleGetEntity env entity + + +{- + HTTP/1.1 302 Found + Location: http://example.org/object/Destination +-} +handleRedirect :: Environment -> Page -> Resource () +handleRedirect env redir + = do BaseURI baseURI <- getSysConf (envSysConf env) + redirect Found (mkObjectURI baseURI $ redirName redir) + + +{- + HTTP/1.1 200 OK + Content-Type: image/png + + ... +-} +handleGetEntity :: Environment -> Page -> Resource () +handleGetEntity env page + = do let lastMod = toClockTime $ pageLastMod page + + case pageRevision page of + 0 -> foundTimeStamp lastMod -- 0 はデフォルトページ + rev -> foundEntity (strongETag $ show rev) lastMod + setContentType (pageType page) + setHeader (C8.pack "Content-Disposition") + (C8.pack $ "attachment; filename=" ++ quoteStr (pageFileName' page)) + outputLBS (pageContent page)