Comment puis-je accepter du contenu compressé gzip utilisant LWP :: UserAgent?
-
18-09-2019 - |
Question
Je suis aller chercher quelques pages sur le Web à l'aide de LWP::UserAgent
de Perl et voudrais être aussi poli que possible. Par défaut, LWP::UserAgent
ne gère pas de façon transparente le contenu compressé via gzip. Est-il un moyen facile de le faire faire, pour sauver tout le monde de la bande passante?
La solution
LWP a cette capacité intégrée, grâce à HTTP::Message
. Mais il est un peu caché.
D'abord assurez-vous que vous avez Compress::Zlib
installé afin que vous puissiez gérer gzip
. HTTP::Message::decodable()
affichera une liste de a permis encodages en fonction des modules que vous avez installés; dans un contexte scalaire, cette sortie prend la forme d'une chaîne délimitée par des virgules que vous pouvez utiliser avec le « Accept-Encoding
» en-tête HTTP, qui HTTP::Request
vous -s. (Sur mon système, avec Compress::Zlib
installé, la liste est « gzip
, x-gzip
, deflate
».)
HTTP::Response
revient, assurez-vous d'accéder au contenu de la place $response->decoded_content
de $response->content
.
LWP::UserAgent
, tout se ensemble comme ceci:
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;
Cela permettra également de décoder le texte aux chaînes unicode de Perl. Si vous uniquement LWP
pour décomprimer la réponse, et non mess avec le texte, faire comme ceci:
print $response->decoded_content(charset => 'none');