@@ -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)