wai-middleware-cache-redis 0.1.4 → 0.2.0
raw patch · 2 files changed
+18/−11 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Network.Wai.Middleware.Cache.Redis: redisBackend :: ConnectInfo -> Integer -> ByteString -> (Request -> Maybe Integer) -> (Request -> [ByteString]) -> (Request -> ByteString) -> (Request -> Maybe ByteString) -> CacheBackend
+ Network.Wai.Middleware.Cache.Redis: redisBackend :: ConnectInfo -> Integer -> ByteString -> (Request -> Maybe Integer) -> (Request -> [ByteString]) -> (Request -> ByteString) -> (Request -> Maybe ByteString) -> (Request -> Bool) -> CacheBackend
Files
src/Network/Wai/Middleware/Cache/Redis.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE OverloadedStrings, DoAndIfThenElse #-} -- | Redis backend for "Network.Wai.Middleware.Cache". -- @@ -49,9 +49,6 @@ -- | Redis backend for "Network.Wai.Middleware.Cache". -- --- Except caching, this backend always adds @ETag@ to 'Response' headers --- with hexed @SHA1@ as value. --- -- This backend can't cache files. Use routing or catch 'CacheBackendError' redisBackend :: R.ConnectInfo @@ -72,8 +69,14 @@ -- ^ @ETag@ value extraction. To extract @If-None-Match@ header -- use 'lookupETag'. Use @(const Nothing)@ for block -- @304@-responses. + -> (Request -> Bool) + -- ^ @ETag@ creation flag. If it 'True', backend adds @ETag@ to + -- 'Response' headers with hexed @SHA1@ as value -> CacheBackend -redisBackend cInfo db cachePrefix ttlFn tagsFn keyFn eTagFn app req = do +redisBackend cInfo db cachePrefix + ttlFn tagsFn keyFn + eTagFn needEtagFn + app req = do rawRes <- liftIO $ do conn <- R.connect cInfo R.runRedis conn $ do @@ -86,13 +89,14 @@ resourceThrow $ CacheBackendError $ BS8.pack $ "Can't cache files : " ++ fp ++ ":" ++ show part _ -> do - d <- parseResponse res + d <- parseResponse needEtag res return (d, ttl, tags) case buildResponse rawRes of Left e -> lift $ resourceThrow $ CacheBackendError e Right r -> return r where - (ttl, tags, key) = (ttlFn req, tagsFn req, keyFn req) + (ttl, tags, key, needEtag) = (ttlFn req, tagsFn req, + keyFn req, needEtagFn req) eTag = case eTagFn req of Nothing -> Nothing Just v -> Just ("header:ETag", v) @@ -118,11 +122,14 @@ $ fromChunks bodyChunks decodeResp _ = Left "Data error" -parseResponse :: Response -> ResourceT IO [(B.ByteString, B.ByteString)] -parseResponse res = do +parseResponse :: Bool -> Response + -> ResourceT IO [(B.ByteString, B.ByteString)] +parseResponse needEtag res = do bodyChunks <- b $= builderToByteStringFlush $= CL.map fromChunk $$ CL.consume - let bodyHash = hex . SHA.finalize . foldl SHA.update SHA.init $ bodyChunks + let bodyHash = if needEtag + then hex . SHA.finalize . foldl SHA.update SHA.init $ bodyChunks + else "" return [("response", S.encode (sc, sm, map (A.first original) (("ETag", bodyHash):hs),
wai-middleware-cache-redis.cabal view
@@ -1,5 +1,5 @@ name: wai-middleware-cache-redis -version: 0.1.4 +version: 0.2.0 cabal-version: >= 1.8 build-type: Simple stability: Experimental