Прозрачная обработка содержимого в кодировке GZip с помощью WWW::Mechanize

StackOverflow https://stackoverflow.com/questions/874262

Вопрос

Я использую 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 никогда не происходило?

Буду признателен за ваше внимание и помощь.Спасибо

Это было полезно?

Решение

Другие советы

Мне кажется, вы можете заменить его, используя элемент $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()));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top