module Network.Wai.Middleware.Gzip (gzip) where
import Network.Wai
import Network.Wai.Zlib
import Data.Maybe (fromMaybe)
import qualified Data.ByteString.Char8 as B
gzip :: Middleware
gzip app env = do
res <- app env
case responseBody res of
Left _ -> return res
Right _ -> do
let enc = fromMaybe []
$ (splitCommas . B.unpack)
`fmap` lookup AcceptEncoding
(requestHeaders env)
if "gzip" `elem` enc
then return res
{ responseBody = compressE $ responseBody res
, responseHeaders = (ContentEncoding, B.pack "gzip")
: responseHeaders res
}
else return res
compressE :: Either FilePath Enumerator -> Either FilePath Enumerator
compressE (Left fp) = Left fp
compressE (Right e) = Right $ compress e
splitCommas :: String -> [String]
splitCommas [] = []
splitCommas x =
let (y, z) = break (== ',') x
in y : splitCommas (drop 1 z)