on master help sign in
There are situation where we want to have some pre-compressed version of our files, maybe they are too big to compress on the fly or we want to use some very expensive gzip algorithm

This allows to *chain* compression thus use all existing settings.

commit5063fd535512f7819c4f963fed7615e78bd1325a authorMarcin Tolysz <tolysz@gmail.com> dateWed 31 Aug 2016, 13:25 (10 years ago) parent8891edd
1 file changed+19−7
wai-extra/Network/Wai/Middleware/Gzip.hs+19−7
wai-extra/Network/Wai/Middleware/Gzip.hs+19−7
@@ -58,6 +58,8 @@ data GzipFiles
5858 -- platforms.
5959 | GzipCacheFolder FilePath -- ^ Compress files, caching them in
6060 -- some directory.
61+ | GzipPreCompressed GzipFiles -- ^ If we use compression use the file with ".gz"
62+ -- appended to the name requested file if it exists
6163 deriving (Show, Eq, Read)
6264
6365-- | Use default MIME settings; /do not/ compress files.
@@ -92,13 +94,23 @@ gzip set app env sendResponse = app env $ \res ->
9294 ResponseFile{} | gzipFiles set == GzipIgnore -> sendResponse res
9395 _ -> if "gzip" `elem` enc && not isMSIE6 && not (isEncoded res) && (bigEnough res)
9496 then
95− case (res, gzipFiles set) of
96− (ResponseFile s hs file Nothing, GzipCacheFolder cache) ->
97− case lookup hContentType hs of
98− Just m
99− | gzipCheckMime set m -> compressFile s hs file cache sendResponse
100− _ -> sendResponse res
101− _ -> compressE set res sendResponse
97+ let runAction x = case x of
98+ (_ , GzipPreCompressed (GzipPreCompressed _)) -> sendResponse res
99+ (ResponseFile s hs file Nothing, GzipPreCompressed nextAction) ->
100+ let
101+ compressedVersion = file ++ ".gz"
102+ in
103+ doesFileExist compressedVersion >>= \x ->
104+ if x
105+ then (sendResponse $ ResponseFile s (fixHeaders hs) compressedVersion Nothing)
106+ else (runAction (ResponseFile s hs file Nothing, nextAction))
107+ (ResponseFile s hs file Nothing, GzipCacheFolder cache) ->
108+ case lookup hContentType hs of
109+ Just m
110+ | gzipCheckMime set m -> compressFile s hs file cache sendResponse
111+ _ -> sendResponse res
112+ _ -> compressE set res sendResponse
113+ in runAction (res, gzipFiles set)
102114 else sendResponse res
103115 where
104116 enc = fromMaybe [] $ (splitCommas . S8.unpack)