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

Foi útil?

Solução

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()));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top