3
Haskell的Network.Browser模塊似乎沒有做任何壓縮。我怎樣才能配置它,以便它假定服務器支持它進行gzip壓縮(或者如果不支持則不會回退到壓縮)?如何讓Haskell的Network.Browser做gzip壓縮?
Haskell的Network.Browser模塊似乎沒有做任何壓縮。我怎樣才能配置它,以便它假定服務器支持它進行gzip壓縮(或者如果不支持則不會回退到壓縮)?如何讓Haskell的Network.Browser做gzip壓縮?
這裏的「相當容易」解決方案rkhayrov指的快速版本:
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
嗨特拉維斯。謝謝。似乎不「乾淨」,但工程。 – qrest 2010-09-28 03:00:15
你指的是客戶端壓縮,即POST-ING gzip壓縮格式的數據?這將需要OPTIONS「預飛行」請求。爲了響應OPTIONS請求,大多數流行的HTTP服務器通常不會發送Accept-Encoding標頭。相反,解壓縮gzip編碼的響應相當容易。 – rkhayrov 2010-09-24 09:32:08