wai-static-cache 0.1.0.0 → 0.1.0.1
raw patch · 2 files changed
+22/−17 lines, 2 filesdep +resourcetdep ~basedep ~bytestringdep ~containers
Dependencies added: resourcet
Dependency ranges changed: base, bytestring, containers, system-filepath, text, transformers, wai
Files
- Network/Wai/StaticCache.hs +13/−9
- wai-static-cache.cabal +9/−8
Network/Wai/StaticCache.hs view
@@ -1,12 +1,13 @@ {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE BangPatterns #-} module Network.Wai.StaticCache-(cacheDir, staticfiles)+(cacheDir, staticfiles, appendCache) where import Data.Conduit -- ( ($$), (=$), runResourceT, ResourceT, ConduitM, awaitForever, yield ) import Data.Conduit.Combinators (sourceDirectoryDeep)+import Control.Monad.Trans.Resource (runResourceT, ResourceT) import Control.Monad.IO.Class (liftIO) import qualified Data.Conduit.List as CL import Prelude hiding (FilePath)@@ -38,22 +39,26 @@ data FileCache = FC !(Vector Word64) !(V.Vector MetaFile) deriving (Show) --- responseFile :: Status -> ResponseHeaders -> FilePath -> Maybe FilePart -> Response+appendCache :: FileCache -> FileCache -> FileCache+appendCache (FC vw1 vm1) (FC vw2 vm2) = FC (vw1 VU.++ vw2) (vm1 V.++ vm2) cacheDir :: FilePath -> IO FileCache cacheDir fp = readDir fp >>= return . buildCache -staticfiles :: FileCache -> Middleware -staticfiles fc app req = fromMaybe (app req) response+staticfiles :: FileCache -> Middleware+staticfiles fc app req sendResponse = response where - response :: Maybe (IO Response)+ -- response :: IO Response response = do let bs = rawPathInfo req+ -- TODO: can isFolder detect folders that do not end with / ? isFolder = if BSC.null bs then True else (BSC.last bs == '/') reqBS = if isFolder then BSC.append bs "index.html" else bs- mf <- getMetaFile fc reqBS- let headers = [ ("Content-Type", mime mf), ("ETag", etag mf) ]- return . return $ responseFile status200 headers (path mf) Nothing+ case getMetaFile fc reqBS of+ Nothing -> app req sendResponse+ Just mf -> do + let headers = [ ("Content-Type", mime mf), ("ETag", etag mf) ]+ sendResponse $ responseFile status200 headers (path mf) Nothing getMetaFile :: FileCache -> ByteString -> Maybe MetaFile getMetaFile (FC ix m) bs = (V.!) m <$> maybePos@@ -68,7 +73,6 @@ ix = VU.generate (V.length metaVec) (\i -> fileId (metaVec V.! i)) readDir :: FilePath -> IO [MetaFile]--- readDir :: String -> IO [MetaFile] readDir f = do l <- runResourceT $ sourceDirectoryDeep False f $$ readIt =$ CL.consume runResourceT $ sequence l
wai-static-cache.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: wai-static-cache-version: 0.1.0.0+version: 0.1.0.1 synopsis: A simple cache for serving static files in a WAI middleware -- description: license: AGPL-3@@ -19,18 +19,19 @@ exposed-modules: Network.Wai.StaticCache -- other-modules: -- other-extensions: - build-depends: base >=4.6 && <4.7+ build-depends: base >= 4 && < 5 , cityhash- , wai+ , wai >= 3.0.1.0 , http-types , conduit , conduit-combinators , vector , vector-algorithms- , transformers == 0.3.0.0- , system-filepath == 0.4.9- , bytestring == 0.10.0.2- , text == 0.11.3.1- , containers == 0.5.0.0+ , transformers + , system-filepath + , bytestring + , text + , containers + , resourcet -- hs-source-dirs: default-language: Haskell2010