salvia-0.0.4: src/Network/Salvia/Handlers/FileSystem.hs
module Network.Salvia.Handlers.FileSystem (
hFileSystem
, hFileSystemNoIndexes
, hFileTypeDispatcher
) where
import Control.Monad.State
import System.Directory (doesDirectoryExist)
import Network.Salvia.Httpd
import Network.Salvia.Handlers.Error
import Network.Salvia.Handlers.File
import Network.Salvia.Handlers.Directory
import Network.Salvia.Handlers.Rewrite
import Network.Protocol.Http
import Network.Protocol.Uri (jail)
import Misc.Misc (bool)
-- Show file contents and show directory indexes.
hFileSystem :: ResourceHandler ()
hFileSystem dir = hFileTypeDispatcher dir hDirectory hFile
-- Show file contents, do not show directory indexes.
hFileSystemNoIndexes :: ResourceHandler ()
hFileSystemNoIndexes dir = hFileTypeDispatcher dir (hError Forbidden) hFile
-- Dispatch based on file type, regular files or directories.
hFileTypeDispatcher :: FilePath -> Handler () -> Handler () -> Handler ()
hFileTypeDispatcher dir hdir hfile =
hWithDir dir
$ hResource
$ hJailedDispatch dir hdir hfile
hJailedDispatch :: FilePath -> Handler () -> Handler () -> ResourceHandler ()
hJailedDispatch dir hdir hfile file = do
case jail dir file of
Nothing -> hError Forbidden
Just f -> do
isDir <- lift (doesDirectoryExist f)
bool hdir hfile isDir