Domanda

Sto usando WWW :: Mechanize e attualmente la manipolazione risposte HTTP con l'intestazione 'Content-Encoding: gzip' nel mio codice prima controllando le intestazioni di risposta e quindi utilizzando IO :: :: Uncompress Gunzip per ottenere il contenuto non compresso.

Comunque mi piacerebbe fare questo in modo trasparente in modo che WWW :: Mechanize metodi come modulo (), link () ecc lavoro su e analizzare il contenuto non compresso. Dal WWW :: Mechanize è una sottoclasse di LWP :: UserAgent, io preferisco usare il LWP :: :: UA gestori per fare questo.

Mentre io sono stato in parte successo (posso stampare il contenuto non compresso, per esempio), non sono in grado di farlo in modo trasparente in modo che io possa chiamare

$mech->forms();

In sintesi:? Come faccio a "sostituire" il contenuto all'interno dell'oggetto $ mech in modo che da quel momento in poi, tutte WWW :: Mechanize metodi funzionano come se il Content-Encoding mai successo

Gradirei la vostra attenzione e aiuto. Grazie

È stato utile?

Soluzione

Altri suggerimenti

Sembra a me come è possibile sostituirlo utilizzando il membro $ res-> contenuto ($ bytes).

A proposito, ho trovato questa roba, cercando in fonte di LWP :: UserAgent, quindi HTTP :: risposta, quindi HTTP :: Messaggio .

E 'costruito con AgenteUtente e quindi Mechanize. Un avvertimento MAJOR per risparmiare un po 'di capelli

-Per di debug, assicuratevi di controllare per errore $ @ dopo la chiamata a decoded_content.

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

Meglio ancora, guardare attraverso la fonte di HTTP :: Messaggio e assicurarsi che tutti i pacchetti di supporto ci sono

Nel mio caso, decoded_content restituito undef mentre il contenuto è binario grezzo, e sono andato su un inseguimento oca selvatica. UserAgent imposterà il flag di errore in caso di errore da decodificare, ma Mechanize sarà solo ignorarlo (Esso non controlla o log l'incidenza come proprio errore / avviso).

Nel mio caso $ @ sez: "Impossibile trovare IO / HTML.pm .. E 'stato eval'ed

Dopo aver dovuto tuffarsi nella fonte, scopro il built-in processo di decodifica è lungo, meticoloso e faticoso, che coprono quasi ogni scenario e fare tonnellate di supposizioni (Grazie Gisle!).

se siete paranoici, impostare in modo esplicito l'intestazione di default da utilizzare con ogni richiesta a new ()

    $browser = new WWW::Mechanize('default_headers' => HTTP::Headers->new('Accept-Encoding' 
                            => scalar HTTP::Message::decodable()));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top