wai-extra 3.1.4 → 3.1.4.1
raw patch · 4 files changed
+17/−9 lines, 4 files
Files
- ChangeLog.md +4/−0
- Network/Wai/Middleware/Gzip.hs +8/−8
- test/WaiExtraSpec.hs +4/−0
- wai-extra.cabal +1/−1
ChangeLog.md view
@@ -1,5 +1,9 @@ # Changelog for wai-extra +## 3.1.4.1++* `Network.Wai.Middleware.Gzip`: Add `Vary: Accept-Encoding` header to responses [#829](https://github.com/yesodweb/wai/pull/829)+ ## 3.1.4 * Export `Network.Wai.Middleware.RequestLogger.JSON.requestToJSON` [#827](https://github.com/yesodweb/wai/pull/827)
Network/Wai/Middleware/Gzip.hs view
@@ -29,6 +29,7 @@ import Data.Default.Class import Network.HTTP.Types ( Status, Header, hContentEncoding, hUserAgent , hContentType, hContentLength)+import Network.HTTP.Types.Header (hVary) import System.Directory (doesFileExist, createDirectoryIfMissing) import Data.ByteString.Builder (byteString) import qualified Data.ByteString.Builder.Extra as Blaze (flush)@@ -43,7 +44,7 @@ import Control.Exception (throwIO) import qualified System.IO as IO import Data.ByteString.Lazy.Internal (defaultChunkSize)-import Data.Word8 (_semicolon)+import Data.Word8 (_semicolon, _space, _comma) data GzipSettings = GzipSettings { gzipFiles :: GzipFiles@@ -93,7 +94,7 @@ -- Will only be applied based on the 'gzipCheckMime' setting. For default -- behavior, see 'defaultCheckMime'. gzip :: GzipSettings -> Middleware-gzip set app env sendResponse = app env $ \res ->+gzip set app env sendResponse' = app env $ \res -> case res of ResponseRaw{} -> sendResponse res ResponseFile{} | gzipFiles set == GzipIgnore -> sendResponse res@@ -118,7 +119,9 @@ in runAction (res, gzipFiles set) else sendResponse res where- enc = fromMaybe [] $ (splitCommas . S8.unpack)+ sendResponse = sendResponse' . mapResponseHeaders (vary:)+ vary = (hVary, "Accept-Encoding")+ enc = fromMaybe [] $ splitCommas `fmap` lookup "Accept-Encoding" (requestHeaders env) ua = fromMaybe "" $ lookup hUserAgent $ requestHeaders env isMSIE6 = "MSIE 6" `S.isInfixOf` ua@@ -223,8 +226,5 @@ where notLength (x, _) = x /= hContentLength -splitCommas :: String -> [String]-splitCommas [] = []-splitCommas x =- let (y, z) = break (== ',') x- in y : splitCommas (dropWhile (== ' ') $ drop 1 z)+splitCommas :: S.ByteString -> [S.ByteString]+splitCommas = map (S.dropWhile (== _space)) . S.split _comma
test/WaiExtraSpec.hs view
@@ -176,12 +176,14 @@ { requestHeaders = [("Accept-Encoding", "gzip")] } assertHeader "Content-Encoding" "gzip" sres1+ assertHeader "Vary" "Accept-Encoding" sres1 liftIO $ decompress (simpleBody sres1) @?= "test" sres2 <- request defaultRequest { requestHeaders = [] } assertNoHeader "Content-Encoding" sres2+ assertHeader "Vary" "Accept-Encoding" sres2 assertBody "test" sres2 caseDefaultCheckMime :: Assertion@@ -203,6 +205,7 @@ ] } assertNoHeader "Content-Encoding" sres1+ assertHeader "Vary" "Accept-Encoding" sres1 liftIO $ simpleBody sres1 @?= "test" caseGzipBypassPre :: Assertion@@ -211,6 +214,7 @@ { requestHeaders = [("Accept-Encoding", "gzip")] } assertHeader "Content-Encoding" "gzip" sres1+ assertHeader "Vary" "Accept-Encoding" sres1 assertBody "test" sres1 -- the body is not actually compressed vhostApp1, vhostApp2, vhostApp :: Application
wai-extra.cabal view
@@ -1,5 +1,5 @@ Name: wai-extra-Version: 3.1.4+Version: 3.1.4.1 Synopsis: Provides some basic WAI handlers and middleware. description: Provides basic WAI handler and middleware functionality: