@@ -1,6 +1,4 @@
1−{-# LANGUAGE Rank2Types #-}
1+{-# LANGUAGE Rank2Types, ScopedTypeVariables #-}
2−{-# LANGUAGE ScopedTypeVariables #-}
3−{-# LANGUAGE OverloadedStrings #-}
4---------------------------------------------------------
2---------------------------------------------------------
6-- Module : Network.Wai.Middleware.Gzip
4-- Module : Network.Wai.Middleware.Gzip
@@ -29,9 +27,8 @@ import Data.Maybe (fromMaybe, isJust)
29import qualified Data.ByteString.Char8 as S8
27import qualified Data.ByteString.Char8 as S8
30import qualified Data.ByteString as S
28import qualified Data.ByteString as S
31import Data.Default.Class
29import Data.Default.Class
32−import Network.HTTP.Types (Status, Header)
30+import Network.HTTP.Types ( Status, Header, hContentEncoding, hUserAgent
33−import Control.Monad.IO.Class (liftIO)
31+ , hContentType, hContentLength)
34−import Control.Monad.Trans.Resource (runResourceT)
35import System.Directory (doesFileExist, createDirectoryIfMissing)
32import System.Directory (doesFileExist, createDirectoryIfMissing)
36import Blaze.ByteString.Builder (fromByteString)
33import Blaze.ByteString.Builder (fromByteString)
37import Control.Exception (try, SomeException)
34import Control.Exception (try, SomeException)
@@ -85,7 +82,7 @@ gzip set app env sendResponse = app env $ \res ->
86 case (res, gzipFiles set) of
83 case (res, gzipFiles set) of
87 (ResponseFile s hs file Nothing, GzipCacheFolder cache) ->
84 (ResponseFile s hs file Nothing, GzipCacheFolder cache) ->
88− case lookup "content-type" hs of
85+ case lookup hContentType hs of
90 | gzipCheckMime set m -> compressFile s hs file cache sendResponse
87 | gzipCheckMime set m -> compressFile s hs file cache sendResponse
91 _ -> sendResponse res
88 _ -> sendResponse res
@@ -94,9 +91,9 @@ gzip set app env sendResponse = app env $ \res ->
95 enc = fromMaybe [] $ (splitCommas . S8.unpack)
92 enc = fromMaybe [] $ (splitCommas . S8.unpack)
96 `fmap` lookup "Accept-Encoding" (requestHeaders env)
93 `fmap` lookup "Accept-Encoding" (requestHeaders env)
97− ua = fromMaybe "" $ lookup "user-agent" $ requestHeaders env
94+ ua = fromMaybe "" $ lookup hUserAgent $ requestHeaders env
98 isMSIE6 = "MSIE 6" `S.isInfixOf` ua
95 isMSIE6 = "MSIE 6" `S.isInfixOf` ua
99− isEncoded res = isJust $ lookup "Content-Encoding" $ responseHeaders res
96+ isEncoded res = isJust $ lookup hContentEncoding $ responseHeaders res
101compressFile :: Status -> [Header] -> FilePath -> FilePath -> (Response -> IO a) -> IO a
98compressFile :: Status -> [Header] -> FilePath -> FilePath -> (Response -> IO a) -> IO a
102compressFile s hs file cache sendResponse = do
99compressFile s hs file cache sendResponse = do
@@ -118,7 +115,7 @@ compressFile s hs file cache sendResponse = do
118 Z.PRNext bs -> do
115 Z.PRNext bs -> do
119 S.hPut outH bs
116 S.hPut outH bs
121− Z.PRError e -> throwIO e
118+ Z.PRError ex -> throwIO ex
122 fix $ \loop -> do
119 fix $ \loop -> do
123 bs <- S.hGetSome inH defaultChunkSize
120 bs <- S.hGetSome inH defaultChunkSize
124 unless (S.null bs) $ do
121 unless (S.null bs) $ do
@@ -145,11 +142,11 @@ compressE :: GzipSettings
145 -> (Response -> IO a)
142 -> (Response -> IO a)
147compressE set res sendResponse =
144compressE set res sendResponse =
148− case lookup "content-type" hs of
145+ case lookup hContentType hs of
149 Just m | gzipCheckMime set m ->
146 Just m | gzipCheckMime set m ->
150 let hs' = fixHeaders hs
147 let hs' = fixHeaders hs
151 in wb $ \body -> sendResponse $ responseStream s hs' $ \sendChunk flush -> do
148 in wb $ \body -> sendResponse $ responseStream s hs' $ \sendChunk flush -> do
152− (blazeRecv, blazeFinish) <- B.newBlazeRecv B.defaultStrategy
149+ (blazeRecv, _) <- B.newBlazeRecv B.defaultStrategy
153 deflate <- Z.initDeflate 1 (Z.WindowBits 31)
150 deflate <- Z.initDeflate 1 (Z.WindowBits 31)
154 let sendBuilder builder = do
151 let sendBuilder builder = do
155 popper <- blazeRecv builder
152 popper <- blazeRecv builder
@@ -164,8 +161,8 @@ compressE set res sendResponse =
164 deflatePopper $ Z.flushDeflate deflate
161 deflatePopper $ Z.flushDeflate deflate
166 deflatePopper popper = fix $ \loop -> do
163 deflatePopper popper = fix $ \loop -> do
167− res <- popper
164+ result <- popper
168− case res of
165+ case result of
169 Z.PRDone -> return ()
166 Z.PRDone -> return ()
170 Z.PRNext bs' -> do
167 Z.PRNext bs' -> do
171 sendChunk $ fromByteString bs'
168 sendChunk $ fromByteString bs'
@@ -183,9 +180,9 @@ compressE set res sendResponse =
183-- different length after gzip compression.
180-- different length after gzip compression.
184fixHeaders :: [Header] -> [Header]
181fixHeaders :: [Header] -> [Header]
185fixHeaders =
182fixHeaders =
186− (("Content-Encoding", "gzip") :) . filter notLength
183+ ((hContentEncoding, "gzip") :) . filter notLength
188− notLength (x, _) = x /= "content-length"
185+ notLength (x, _) = x /= hContentLength
190splitCommas :: String -> [String]
187splitCommas :: String -> [String]
191splitCommas [] = []
188splitCommas [] = []