如何在Haskell的Network.Browser模块中启用gzip压缩?
看起来Haskell的Network.Browser模块没有进行任何压缩。如果服务器支持gzip压缩,我该如何配置它以启用gzip压缩(如果服务器不支持,则回退到未压缩)?
看起来Haskell的Network.Browser模块没有进行任何压缩。如果服务器支持gzip压缩,我该如何配置它以启用gzip压缩(如果服务器不支持,则回退到未压缩)?
import Codec.Compression.GZip (decompress)
import Control.Arrow (second)
import Control.Monad (liftM)
import qualified Data.ByteString.Lazy as B
import Network.Browser
import Network.HTTP (Request, Response, getRequest, getResponseBody, rspBody)
import Network.HTTP.Headers (HasHeaders, HeaderName (..), findHeader, replaceHeader)
import Network.TCP (HStream, HandleStream)
import Network.URI (URI, parseURI)
gzipRequest :: URI -> BrowserAction (HandleStream B.ByteString) (URI, Response B.ByteString)
gzipRequest
= liftM (second unzipIfNeeded)
. request
. replaceHeader HdrAcceptEncoding "gzip"
. defaultGETRequest_
where
unzipIfNeeded rsp
| isGz rsp = rsp { rspBody = decompress $ rspBody rsp }
| otherwise = rsp
where
isGz rsp = maybe False (== "gzip") $ findHeader HdrContentEncoding rsp
main = print =<< rspBody . snd <$> (getResponse =<< head <$> getArgs)
where
getResponse = browse . gzipRequest . fromJust . parseURI