packages feed

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