Прозрачная обработка содержимого в кодировке GZip с помощью WWW::Mechanize
-
22-08-2019 - |
Вопрос
Я использую WWW::Mechanize и в настоящее время обрабатываю HTTP-ответы с помощью 'Content-Encoding: gzip
' в моем коде, сначала проверив заголовки ответов, а затем используя IO::Uncompress::Gunzip, чтобы получить несжатый контент.
Однако я хотел бы сделать это прозрачно, чтобы методы WWW::Mechanize, такие как form(),links() и т.д., работали и анализировали несжатый контент.Поскольку WWW::Mechanize является подклассом LWP::UserAgent, я бы предпочел использовать LWP::UA::обработчики сделать это.
Хотя мне это частично удалось (например, я могу распечатать несжатый контент), я не могу сделать это прозрачно, чтобы можно было вызвать
$mech->forms();
В итоге:Как мне «заменить» содержимое внутри объекта $mech, чтобы с этого момента все методы WWW::Mechanize работали так, как будто Content-Encoding никогда не происходило?
Буду признателен за ваше внимание и помощь.Спасибо
Решение
WWW::Механизировать::GZip, Я думаю.
Другие советы
Мне кажется, вы можете заменить его, используя элемент $res->content($bytes).
Кстати, я нашел это, посмотрев исходный код LWP::UserAgent, затем HTTP::Response, а затем HTTP::Сообщение.
Он встроен в UserAgent и, следовательно, в Mechanize. Одно ГЛАВНОЕ предостережение чтобы сэкономить тебе волосы
-Для отладки обязательно проверьте наличие ошибок. $@ после вызова decoded_content.
$html = $r->decoded_content;
die $@ if $@;
А еще лучше просмотрите исходный код HTTP::Message и убедитесь, что там есть все пакеты поддержки.
В моем случае decoded_content вернул undef, в то время как контент представляет собой необработанный двоичный файл, и я начал гоняться за дикими гусями.UserAgent установит флаг ошибки при невозможности декодирования, но Mechanize просто проигнорирует его (он не проверяет и не регистрирует инцидент как собственную ошибку/предупреждение).
В моем случае $@sez:«Невозможно найти IO/HTML.pm..Это было оценено
Покопавшись в исходном коде, я обнаружил, что встроенный процесс декодирования долгий, дотошный и трудный, охватывающий практически каждый сценарий и делающий массу предположений (спасибо, Жисл!).
если вы параноик, явно установите заголовок по умолчанию, который будет использоваться с каждым запросом в new().
$browser = new WWW::Mechanize('default_headers' => HTTP::Headers->new('Accept-Encoding'
=> scalar HTTP::Message::decodable()));