4 module Rakka.Resource.Object
8 import qualified Codec.Binary.UTF8.String as UTF8
9 import Control.Monad.Unicode
10 import qualified Data.Text as T
11 import Network.HTTP.Lucu
12 import Prelude.Unicode
13 import Rakka.Environment
16 import Rakka.SystemConfig
17 import System.FilePath.Posix
19 resObject ∷ Environment → ResourceDef
22 resUsesNativeThread = False
24 , resGet = Just $ getPathInfo ≫= handleGet env ∘ toPageName
31 toPageName ∷ [String] → PageName
32 toPageName = T.pack ∘ UTF8.decodeString . joinPath
34 handleGet :: Environment -> PageName -> Resource ()
36 = do pageM <- getPage (envStorage env) name Nothing
38 Nothing -> foundNoEntity Nothing
39 Just page -> if isEntity page then
42 handleRedirect env page
47 Location: http://example.org/object/Destination
49 handleRedirect :: Environment -> Page -> Resource ()
50 handleRedirect env redir
51 = do BaseURI baseURI <- getSysConf (envSysConf env)
52 redirect Found (mkObjectURI baseURI $ redirName redir)
57 Content-Type: image/png
61 handleGetEntity :: Page -> Resource ()
63 = do case entityRevision page of
64 0 -> foundTimeStamp (entityLastMod page) -- 0 はデフォルトページ
65 rev -> foundEntity (strongETag $ show rev) (entityLastMod page)
67 setContentType (entityType page)
68 outputLBS (entityContent page)