@@ -1,5 +1,6 @@
11{-# LANGUAGE ScopedTypeVariables #-}
22{-# LANGUAGE OverloadedStrings #-}
3+{-# LANGUAGE BangPatterns #-}
34-- | Access files on the filesystem.
45module WaiAppStatic.Storage.Filesystem
56 ( -- * Types
@@ -12,6 +13,7 @@ module WaiAppStatic.Storage.Filesystem
1213
1314import WaiAppStatic.Types
1415import System.FilePath ((</>))
16+import System.IO (withBinaryFile, IOMode(..))
1517import System.Directory (doesFileExist, doesDirectoryExist, getDirectoryContents)
1618import Data.List (foldl')
1719import Control.Monad (forM)
@@ -23,10 +25,9 @@ import WaiAppStatic.Listing
2325import Network.Mime
2426import System.PosixCompat.Files (fileSize, getFileStatus, modificationTime, isRegularFile)
2527import Data.Maybe (catMaybes)
26−import qualified Crypto.Hash.Conduit (hashFile)
27−import Data.Byteable (toBytes)
28−import Crypto.Hash (MD5, Digest)
29−import qualified Data.ByteString.Base64 as B64
28+import Data.ByteArray.Encoding
29+import Crypto.Hash (hashlazy, MD5, Digest)
30+import qualified Data.ByteString.Lazy as BL (hGetContents)
3031import qualified Data.Text as T
3132
3233-- | Construct a new path from a root and some @Pieces@.
@@ -119,9 +120,10 @@ webAppLookup hashFunc prefix pieces =
119120-- | MD5 hash and base64-encode the file contents. Does not check if the file
120121-- exists.
121122hashFile :: FilePath -> IO ByteString
122−hashFile fp = do
123− h <- Crypto.Hash.Conduit.hashFile fp
124− return $ B64.encode $ toBytes (h :: Digest MD5)
123+hashFile fp = withBinaryFile fp ReadMode $ \h -> do
124+ f <- BL.hGetContents h
125+ let !hash = hashlazy f :: Digest MD5
126+ return $ convertToBase Base64 hash
125127
126128hashFileIfExists :: ETagLookup
127129hashFileIfExists fp = do