1 -- -*- Coding: utf-8 -*-
2 module Rakka.Resource.Object
7 import Data.ByteString.Char8 as C8
9 import Network.HTTP.Lucu
10 import Network.HTTP.Lucu.Utils
11 import Rakka.Environment
14 import Rakka.SystemConfig
17 resObject :: Environment -> ResourceDef
20 resUsesNativeThread = False
22 , resGet = Just $ getPathInfo >>= handleGet env . toPageName
29 toPageName :: [String] -> PageName
30 toPageName = decodePageName . joinWith "/"
33 handleGet :: Environment -> PageName -> Resource ()
35 = do pageM <- getPage (envStorage env) name Nothing
38 -> foundNoEntity Nothing
40 Just redir@(Redirection _ _ _ _ _)
41 -> handleRedirect env redir
43 Just entity@(Entity _ _ _ _ _ _ _ _ _ _ _ _ _ _ _)
44 -> handleGetEntity entity
49 Location: http://example.org/object/Destination
51 handleRedirect :: Environment -> Page -> Resource ()
52 handleRedirect env redir
53 = do BaseURI baseURI <- getSysConf (envSysConf env)
54 redirect Found (mkObjectURI baseURI $ redirName redir)
59 Content-Type: image/png
63 handleGetEntity :: Page -> Resource ()
65 = do case entityRevision page of
66 0 -> foundTimeStamp (entityLastMod page) -- 0 はデフォルトページ
67 rev -> foundEntity (strongETag $ show rev) (entityLastMod page)
69 setContentType (entityType page)
70 setHeader (C8.pack "Content-Disposition")
71 (C8.pack $ "attachment; filename=" ++ quoteStr (entityFileName' page))
72 outputLBS (entityContent page)