Sto recuperando alcune pagine sul Web utilizzando Perl LWP::UserAgent
e vorrei essere il più educato possibile. Per impostazione predefinita, LWP::UserAgent
non gestisce il contenuto compresso tramite gzip. C'è un modo semplice per farlo fare così, per salvare tutti un po 'di larghezza di banda?Come posso accettare il contenuto compresso con gzip usando LWP :: UserAgent?
risposta
LWP ha questa funzionalità integrata, grazie a HTTP::Message
. Ma è un po 'nascosto.
Per prima cosa assicurarsi di aver installato Compress::Zlib
in modo da poter gestire gzip
. HTTP::Message::decodable()
visualizzerà un elenco di codifiche consentite in base ai moduli installati; in contesto scalare, questo output assume la forma di una stringa delimitata da virgole che è possibile utilizzare con l'intestazione HTTP 'Accept-Encoding
', che è necessario aggiungere LWP
al proprio HTTP::Request
-s. (Sul mio sistema, con Compress::Zlib
installato, la lista è "gzip
, x-gzip
, deflate
".)
Quando il HTTP::Response
torna, essere sicuri di accedere al contenuto con $response->decoded_content
invece di $response->content
.
In LWP::UserAgent
, si parla tutti insieme in questo modo:
my $ua = LWP::UserAgent->new;
my $can_accept = HTTP::Message::decodable;
my $response = $ua->get('http://stackoverflow.com/feeds',
'Accept-Encoding' => $can_accept,
);
print $response->decoded_content;
Questo sarà anche decodificare testo per le stringhe Unicode di Perl. Se solo desidera LWP
per decomprimere la risposta, e non si scherza con il testo, fare in questo modo:
print $response->decoded_content(charset => 'none');
Nota: Questo funziona con LWP 5.814 (da luglio 08) o più recente. –
Dal mio test con LWP 6.03 tutto ciò che era necessario era usare 'decoded_content' piuttosto che' content'. – Cas