5

我正在使用 WWW::Mechanize 并且当前Content-Encoding: gzip通过首先检查响应标头然后使用 IO::Uncompress::Gunzip 来获取未压缩的内容来处理我的代码中带有 ' ' 标头的 HTTP 响应。

但是,我想透明地执行此操作,以便 WWW::Mechanize 方法(如 form()、links() 等)可以处理并解析未压缩的内容。由于 WWW::Mechanize 是 LWP::UserAgent 的子类,因此我更喜欢使用LWP::UA::handlers来执行此操作。

虽然我已经部分成功(例如,我可以打印未压缩的内容),但我无法以我可以调用的方式透明地做到这一点

$mech->forms();

总而言之:我如何“替换” $mech 对象中的内容,以便从那时起,所有 WWW::Mechanize 方法都像 Content-Encoding 从未发生过一样工作?

感谢您的关注和帮助。谢谢

4

3 回答 3

8

WWW::Mechanize::GZip,我想。

于 2009-05-17T11:00:47.400 回答
3

在我看来,您可以使用 $res->content( $bytes ) 成员来替换它。

顺便说一句,我通过查看 LWP::UserAgent 的来源,然后是 HTTP::Response,然后是HTTP::Message找到了这些东西。

于 2009-05-17T10:51:43.383 回答
0

它内置于 UserAgent 中,因此是 Mechanize。一个重要的警告可以为您节省一些头发

- 要调试,请确保在调用 decoded_content 后检查错误$@ 。

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

更好的是,查看 HTTP::Message 的源代码并确保所有支持包都在那里

在我的例子中,decoded_content 返回 undef,而 content 是原始二进制文件,我进行了一场疯狂的追逐。UserAgent 将在解码失败时设置错误标志,但 Mechanize 将忽略它(它不会检查或记录发生率作为自己的错误/警告)。

就我而言,$@ sez:“找不到 IO/HTML.pm .. 它已被评估

在不得不深入研究源代码后,我发现内置的解码过程漫长、细致、艰巨,几乎涵盖了所有场景并进行了大量猜测(谢谢 Gisle!)。

如果您是偏执狂,请在 new() 处明确设置要与每个请求一起使用的默认标头

    $browser = new WWW::Mechanize('default_headers' => HTTP::Headers->new('Accept-Encoding' 
                            => scalar HTTP::Message::decodable()));
于 2013-09-05T09:56:12.037 回答