Question

J'utilise WWW :: Mechanize et manipulation actuellement 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 et puis en utilisant IO :: Décompresser :: Gunzip pour obtenir le contenu non compressé.

Cependant, je voudrais faire en toute transparence afin que WWW :: mécaniser des méthodes telles que la forme (), liens () etc travaux et analyser le contenu non compressé. Depuis WWW :: Mechanize est une sous-classe de LWP :: UserAgent, je préfère utiliser le LWP :: UA :: gestionnaires pour le faire.

Alors que 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 dans l'objet mech $ afin qu'à partir de ce moment-là, tous WWW :: méthodes mécaniser fonctionnent comme si le Content-Encoding n'a jamais eu lieu

Je vous serais reconnaissant de votre attention et aide. Merci

Était-ce utile?

La solution

Autres conseils

Il me semble que vous pouvez le remplacer en utilisant le membre contenu $ res-> (octets $).

Par ailleurs, je trouve ce genre de choses en regardant la source de LWP :: UserAgent, puis HTTP :: réponse, puis HTTP :: message .

Il est construit avec UserAgent et donc 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 $@ if $@;

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 une chasse aux oies sauvages. UserAgent définira l'indicateur d'erreur en cas d'échec de décoder, mais Mechanize va simplement l'ignorer (Il ne vérifie pas ou connectez-vous l'incidence que sa propre erreur / avertissement).

Dans mon cas $ @ pour 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 longue, méticuleux et laborieux, 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()));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top