X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Network%2FHTTP%2FLucu%2FStaticFile.hs;h=5b0ce579ed66e41bc0c1e1d926588743e05468ae;hb=f62b6f07bbf1eefcf552163d8f7daa6e0862ed5d;hp=a83f285858411d50ff37d00137c8731651914643;hpb=858129cb755aa09da2b7bd758efb8519f2c89103;p=Lucu.git diff --git a/Network/HTTP/Lucu/StaticFile.hs b/Network/HTTP/Lucu/StaticFile.hs index a83f285..5b0ce57 100644 --- a/Network/HTTP/Lucu/StaticFile.hs +++ b/Network/HTTP/Lucu/StaticFile.hs @@ -13,7 +13,7 @@ module Network.HTTP.Lucu.StaticFile import Control.Monad import Control.Monad.Trans import qualified Data.ByteString.Lazy.Char8 as B -import Data.ByteString.Lazy.Char8 (ByteString) +import Data.Time.Clock.POSIX import Network.HTTP.Lucu.Abortion import Network.HTTP.Lucu.Config import Network.HTTP.Lucu.ETag @@ -23,7 +23,6 @@ import Network.HTTP.Lucu.Resource import Network.HTTP.Lucu.Resource.Tree import Network.HTTP.Lucu.Response import Network.HTTP.Lucu.Utils -import System.Directory import System.Posix.Files @@ -54,33 +53,33 @@ staticFile path handleStaticFile :: FilePath -> Resource () handleStaticFile path = path `seq` - do isFile <- liftIO $ doesFileExist path - if isFile then + do exists <- liftIO $ fileExist path + if exists then -- 存在はした。讀めるかどうかは知らない。 - do readable <- liftIO $ fileAccess path True False False - unless readable + do stat <- liftIO $ getFileStatus path + if isRegularFile stat then + do readable <- liftIO $ fileAccess path True False False + unless readable -- 讀めない $ abort Forbidden [] Nothing + -- 讀める + tag <- liftIO $ generateETagFromFile path + let lastMod = posixSecondsToUTCTime $ fromRational $ toRational $ modificationTime stat + foundEntity tag lastMod - -- 讀める - tag <- liftIO $ generateETagFromFile path - lastMod <- liftIO $ getModificationTime path - foundEntity tag lastMod + -- MIME Type を推定 + conf <- getConfig + case guessTypeByFileName (cnfExtToMIMEType conf) path of + Nothing -> return () + Just mime -> setContentType mime - -- MIME Type を推定 - conf <- getConfig - case guessTypeByFileName (cnfExtToMIMEType conf) path of - Nothing -> return () - Just mime -> setContentType mime - - -- 實際にファイルを讀んで送る - (liftIO $ B.readFile path) >>= outputBS - else - do isDir <- liftIO $ doesDirectoryExist path - if isDir then - abort Forbidden [] Nothing + -- 實際にファイルを讀んで送る + liftIO (B.readFile path) >>= outputLBS else - foundNoEntity Nothing + abort Forbidden [] Nothing + else + foundNoEntity Nothing + -- |Computation of @'generateETagFromFile' fpath@ generates a strong -- entity tag from a file. The file doesn't necessarily have to be a