Как заставить Haskell's Network.Browser выполнять сжатие gzip? - PullRequest
3 голосов
/ 24 сентября 2010

Модуль Haskell Network.Browser, похоже, не выполняет никакого сжатия. Как я могу настроить его так, чтобы он выполнял сжатие gzip, предполагая, что сервер его поддерживает (или отказывается от сжатия, если это не так)?

1 Ответ

3 голосов
/ 24 сентября 2010

Вот краткая версия «довольно простого» решения, на которое ссылается Рхайров:

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

Он работает, как и ожидалосьна обеих Yahoo (сжатых) и Google (несжатых) домашних страницах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...