2010-09-24 5 views
3

Le module Network.Browser de Haskell semble ne pas effectuer de compression. Comment est-ce que je peux le configurer de manière à ce qu'il fasse de la compression gzip en supposant que le serveur le supporte (ou ne retombe à aucune compression si ce n'est pas le cas)?Comment faire Network.Browser Haskell faire compression gzip?

+0

Faites-vous référence à la compression côté client, c'est-à-dire POST-ing de données de formulaire compressées par gzip? Cela nécessiterait une demande OPTIONS "pré-vol". Les serveurs HTTP les plus populaires n'envoient généralement pas l'en-tête Accept-Encoding en réponse à la requête OPTIONS. Au contraire, la décompression de la réponse encodée par gzip est plutôt facile. – rkhayrov

Répondre

3

Voici une version rapide du « assez facile » solution rkhayrov fait référence à:

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 

J'ai couru quelques tests avec les éléments suivants:

main = print =<< rspBody . snd <$> (getResponse =<< head <$> getArgs) 
    where 
    getResponse = browse . gzipRequest . fromJust . parseURI 

Il fonctionne comme prévu sur les deux Yahoo (compressé) et Google (non compressé) pages d'accueil.

+0

Salut Travis. Merci. Ne semble pas "propre", mais fonctionne. – qrest

Questions connexes