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