@@ -9,6 +9,9 @@ import Data.Text (unpack)
99import Data.Text.Encoding (decodeUtf8With)
1010import Data.Text.Encoding.Error (lenientDecode)
1111import Control.Monad.IO.Class (liftIO)
12+import Network.Wai.Handler.Warp.Util (mimeTypes, getFileSize)
13+import qualified Data.Map as Map
14+import qualified Data.ByteString.Char8 as S8
1215
1316main :: IO ()
1417main = do
@@ -30,9 +33,13 @@ app prefix Request { requestMethod = m, pathInfo = p }
3033 let ext = reverse $ takeWhile (/= '.') $ reverse file
3134 let ct = getCT ext
3235 e <- liftIO $ doesFileExist file
33− -- FIXME check file size
3436 if e
35− then return $ ResponseFile status200 [("Content-Type", ct)] file
37+ then do
38+ size <- liftIO $ getFileSize file
39+ return $ ResponseFile status200
40+ [ ("Content-Type", ct)
41+ , ("Content-Length", S8.pack $ show size)
42+ ] file
3643 else return $ responseLBS status404 [("Content-Type", "text/plain")] "File not found"
3744 | otherwise =
3845 return $ responseLBS status405 [("Content-Type", "text/plain")] "Bad method"
@@ -58,14 +65,7 @@ join [x] = x
5865join (x:xs) = x ++ '/' : join xs
5966
6067getCT :: String -> ByteString
61−getCT "jpg" = "image/jpeg"
62−getCT "jpeg" = "image/jpeg"
63−getCT "js" = "text/javascript"
64−getCT "css" = "text/css"
65−getCT "html" = "text/html"
66−getCT "png" = "image/png"
67−getCT "gif" = "image/gif"
68−getCT "txt" = "text/plain"
69−getCT "flv" = "video/x-flv"
70−getCT "ogv" = "video/ogg"
71−getCT _ = "application/octet-stream"
68+getCT s =
69+ case Map.lookup (S8.pack s) mimeTypes of
70+ Just ct -> ct
71+ Nothing -> "application/octet-stream"