2009-05-17 10 views
4

J'utilise WWW :: Mechanize et je gère actuellement les réponses HTTP avec l'en-tête 'Content-Encoding: gzip' dans mon code en vérifiant d'abord les en-têtes de réponse, puis en utilisant IO :: Uncompress :: Gunzip pour obtenir le contenu non compressé.Manipulation transparente du contenu codé GZip avec WWW :: Mechanize

Cependant, je voudrais le faire de manière transparente afin que les méthodes de WWW :: Mechanize comme form(), links() etc fonctionnent sur et analysent le contenu non compressé. Puisque WWW :: Mechanize est une sous-classe de LWP :: UserAgent, je préférerais utiliser le LWP::UA::handlers pour ce faire.

Même si je suis en partie réussie (je peux imprimer le contenu non compressé par exemple), je suis incapable de le faire en toute transparence d'une manière que je peux appeler

$mech->forms(); 

En résumé: Comment puis-je « REMPLACER "le contenu à l'intérieur de l'objet $ mech pour qu'à partir de ce moment-là, toutes les méthodes de WWW :: Mechanize fonctionnent comme si le Content-Encoding n'était jamais arrivé?

J'apprécierais votre attention et votre aide. Merci

Répondre

7
+0

Merci! Je me demande comment je l'ai raté - j'ai fait une recherche CPAN :) –

3

Il me semble que vous pouvez le remplacer en utilisant le membre $ res-> content ($ bytes). En passant, j'ai trouvé ce truc en regardant la source de LWP :: UserAgent, puis HTTP :: Response, puis HTTP::Message.

+0

Oui, ça marche, je vais l'utiliser quand je veux faire plus que du contenu gunzip Pour l'instant, je vais juste utiliser t Le module proposé par Fayland –

+0

Attention, WWW :: Mechanize :: GZip semble être assez bogué (voir http://stackoverflow.com/questions/6874076/perl-how-to-avoid-diagnostic-messages-from-not- modules directement inclus). Désolé, je ne comprends pas complètement la méthode de remplacement dont vous parlez: pouvez-vous donner un exemple de code, s'il vous plaît? – MarcoS

+0

@jettero: Vouliez-vous dire "$ res-> decoded_content()"? En tout cas, j'ai voté votre réponse parce que je n'ai même pas pensé à vérifier cela.Donc je l'ai trouvé quand j'ai cherché "Encoding" dans [perldoc HTTP :: Response] (http://search.cpan.org/perldoc?HTTP::Response). Merci! –

0

Il est intégré avec UserAgent et ainsi mécaniser. Une mise en garde MAJOR pour vous sauver des cheveux

-Pour debug, assurez-vous de vérifier l'erreur $ @ après l'appel à decoded_content.

$html = $r->decoded_content; 
die [email protected] if [email protected]; 

Mieux encore, regarder à travers la source de HTTP :: message et assurez-vous que tous les programmes de soutien sont là

Dans mon cas, decoded_content retourné FNUD alors que le contenu est binaire brut, et je suis allé sur un chasse à l'oie sauvage. UserAgent mettra l'indicateur d'erreur en cas d'échec à décoder, mais Mechanize l'ignorera simplement (il ne vérifie pas ou n'identifie pas l'incidence comme sa propre erreur/avertissement).

Dans mon cas $ @ sez: « Vous ne trouvez pas IO/HTML.pm .. Il a été eval'ed

Après avoir à plonger dans la source, je trouve le processus de décodage intégré est long, méticuleux, et ardu, couvrant à peu près tous les scénarios et faire des tonnes de suppositions (Merci Gisle!).

si vous êtes paranoïaque, définissez explicitement l'en-tête par défaut à utiliser avec chaque demande à nouveau()

$browser = new WWW::Mechanize('default_headers' => HTTP::Headers->new('Accept-Encoding' 
          => scalar HTTP::Message::decodable()));