module Ketchup.Static
( static
) where
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as M
import Ketchup.Httpd
import Ketchup.Utils
import Network
import System.Directory (doesFileExist)
static :: B.ByteString -> Socket -> HTTPRequest
-> (M.Map B.ByteString B.ByteString) -> IO ()
static folder hnd req params = do
let path = B.concat [folder, uri req]
let sane = sanecheck path
let strPath = B.unpack path
doesExist <- doesFileExist strPath
case and [sane, doesExist] of
True -> B.readFile strPath
>>= sendReply hnd 200 []
False -> sendNotFound hnd
sanecheck :: B.ByteString -> Bool
sanecheck url =
and checks
where
checks = [parentcheck]
parentcheck = length (filter (== "..") pieces) > 0
pieces = B.split '/' url