Frage

Ich bin mit WWW :: Mechanize und Handhabung zur Zeit HTTP-Antworten mit dem Header ‚Content-Encoding: gzip‘ in meinem Code, indem zuerst die Antwort-Header überprüft und dann unter Verwendung von IO :: Uncompress :: Gunzip die unkomprimierten Inhalte zu erhalten.

Allerdings würde Ich mag diese transparent machen, so dass WWW :: Methoden wie Form Mechanize (), Links () usw. Arbeit auf und die unkomprimierten Inhalte analysieren. Da WWW :: Mechanize eine Unterklasse von LWP :: Useragent ist, würde ich es vorziehen, die :: UA :: Handler dies zu tun.

Während ich teilweise erfolgreich war (ich die unkomprimierten Inhalte zum Beispiel drucken kann), ich bin nicht in der Lage dies in eine Weise transparent zu machen, die ich anrufen kann

$mech->forms();

Zusammengefasst: Wie kann ich den Inhalt innerhalb des $ mech Objekt „ersetzen“, so dass von diesem Zeitpunkt an alle WWW :: Mechanize Methoden arbeiten, als ob die Content-Encoding nie passiert

würde ich Ihre Aufmerksamkeit und Hilfe zu schätzen wissen. Dank

War es hilfreich?

Lösung

Andere Tipps

Es scheint mir, wie Sie es mit Hilfe des $ res-> Inhalt ($ Bytes) Mitglied ersetzen kann.

By the way, ich dieses Zeug gefunden an der Quelle der LWP suchen :: Useragent, dann HTTP :: Antwort, dann HTTP :: Nachricht .

Es ist mit Useragent eingebaut und somit Mechanize. Ein wichtiger Vorbehalt Sie einige Haare speichern

-Um debug, stellen Sie sicher, dass Sie für Fehler überprüfen $ @ nach dem Aufruf von decoded_content.

$html = $r->decoded_content;
die $@ if $@;

Noch besser wäre es, schauen Sie durch die Quelle der HTTP :: Nachricht und stellen Sie sicher, dass alle Support-Pakete gibt es

In meinem Fall decoded_content zurück undef während Inhalt ist roh binär, und ich ging auf eine Reihe von Ungereimtheiten. Useragent wird die Fehler-Flags auf Scheitern verurteilt zu entschlüsseln, aber Mechanize wird es einfach ignorieren (Es wird nicht überprüft oder die Häufigkeit als seine eigenen Fehler / Warnung lügt).

In meinem Fall $ @ sez: „Can not IO finden / HTML.pm .. Es wurde eval'ed

Nach dem in die Quelle zu tauchen ist, finde ich heraus, die sich im internen Decodierungsprozess ist lang, akribisch, und beschwerlich und deckt nahezu jeden Szenario und machen jede Menge Vermutungen (Danke Gisle!).

Wenn Sie paranoid sind, explizit die Standard-Header-Set mit jeder Anforderung verwendet wird bei neuen ()

    $browser = new WWW::Mechanize('default_headers' => HTTP::Headers->new('Accept-Encoding' 
                            => scalar HTTP::Message::decodable()));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top