Transparente Manipulando conteúdo GZip codificado com WWW :: mechanize
-
22-08-2019 - |
Pergunta
Eu estou usando WWW :: mechanize e atualmente manipulação HTTP respostas com o cabeçalho 'Content-Encoding: gzip
' no meu código verificando primeiro os cabeçalhos de resposta e, em seguida, usando IO :: Descompacte :: Gunzip para obter o conteúdo descompactado.
No entanto, eu gostaria de fazer isso de forma transparente para que métodos WWW :: mecanizar como forma (), links () etc trabalho sobre e analisar o conteúdo descompactado. Desde WWW :: mechanize é uma sub-classe de LWP :: UserAgent, eu preferiria usar o LWP :: UA :: manipuladores para fazer isso.
Enquanto eu ter sido parcialmente bem-sucedida (I pode imprimir o conteúdo descompactado por exemplo), eu sou incapaz de fazer isso de forma transparente em uma maneira que eu posso chamar
$mech->forms();
Em resumo:? Como faço para "substituir" o conteúdo dentro do objeto mech $ modo que a partir desse momento, todos WWW :: mechanize métodos de trabalho como se o não Content-Encoding aconteceu
Eu apreciaria sua atenção e ajuda. Graças
Solução
WWW :: mechanize :: GZip , eu acho.
Outras dicas
Parece-me que você pode substituí-lo usando o membro $ res-> conteúdo ($ bytes).
A propósito, eu achei essas coisas por olhar para a fonte de LWP :: UserAgent, então HTTP :: Response, em seguida, HTTP :: Mensagem .
É construído com UserAgent e assim Mecanizar. Uma ressalva importante para poupar alguns cabelos
-Para depuração, certifique-se de verificar se há erro $ @ após a chamada para decoded_content.
$html = $r->decoded_content;
die $@ if $@;
Melhor ainda, olhar através da fonte de HTTP :: Mensagem e garantir que todos os pacotes de suporte estão lá
No meu caso, decoded_content voltou undef enquanto o conteúdo é binário cru, e eu fui em um ganso selvagem. UserAgent irá definir o sinalizador de erro em caso de falha de decodificação, mas Mecanizar vai simplesmente ignorá-lo (Ele não verifica ou registrar a incidência como seu próprio erro / aviso).
No meu caso $ @ Sez: "Não é possível encontrar IO / HTML.pm .. Foi eval'ed
Depois de ter que mergulhar na fonte, eu descobrir os, cobrindo praticamente todos os cenários e fazendo toneladas built-in processo de decodificação é longo, meticuloso e árdua de suposições (Obrigado Gisle!).
Se você é paranóico, definir explicitamente o cabeçalho padrão a ser usado com cada pedido de nova ()
$browser = new WWW::Mechanize('default_headers' => HTTP::Headers->new('Accept-Encoding'
=> scalar HTTP::Message::decodable()));