WWW::Mechanize を使用した GZip エンコードされたコンテンツの透過的な処理
-
22-08-2019 - |
質問
私は WWW::Mechanize を使用しており、現在 ' で HTTP 応答を処理しています。Content-Encoding: gzip
' コード内のヘッダーを最初に応答ヘッダーをチェックし、次に IO::Uncompress::Gunzip を使用して非圧縮コンテンツを取得します。
ただし、form()、links() などの WWW::Mechanize メソッドが非圧縮コンテンツを処理および解析できるように、これを透過的に実行したいと考えています。WWW::Mechanize は LWP::UserAgent のサブクラスであるため、 LWP::UA::ハンドラー これをする。
部分的には成功しましたが(たとえば、非圧縮コンテンツを印刷できます)、呼び出し可能な方法でこれを透過的に実行することはできません。
$mech->forms();
要約すれば:$mech オブジェクト内のコンテンツを「置換」して、その時点以降、すべての WWW::Mechanize メソッドが Content-Encoding がまったく起こらなかったかのように動作するようにするにはどうすればよいでしょうか?
ご注意とご協力をお願いいたします。ありがとう
解決
WWW :: Mechanizeの:: Gzipでに、私は思います。
他のヒント
それはあなたが$ RES->コンテンツ($バイト)部材を用いてそれを置き換えることができますように私には見えます。
ちなみに、私はLWP :: UserAgentののソースを見て、このようなものを見つけ、その後、HTTP ::レスポンス、そして<のhref =「https://metacpan.org/pod/HTTP::Message」のrel = "nofollowをnoreferrer"> HTTP ::メッセージでます。
これは UserAgent に組み込まれているため、Mechanize になります。 重要な注意点が 1 つあります 髪を少しでも節約するために
- デバッグするには、必ずエラーをチェックしてください $@ decoded_content の呼び出し後。
$html = $r->decoded_content;
die $@ if $@;
さらに良いのは、HTTP::Message のソースを調べて、すべてのサポート パッケージが存在することを確認することです。
私の場合、コンテンツが生のバイナリであるにもかかわらず、decoded_content が undef を返したので、猛追することになりました。UserAgent はデコードに失敗するとエラー フラグを設定しますが、Mechanize はそれを無視します (発生率を独自のエラー/警告としてチェックしたり記録したりしません)。
私の場合 $@ sez:「IO/HTML.pm が見つかりません ..評価されました
ソースを詳しく調べてみると、組み込みのデコード プロセスは長く、細心の注意を払い、骨の折れる作業であり、ほぼすべてのシナリオをカバーし、大量の推測を行う必要があることがわかりました (Gisle さん、ありがとう!)。
偏執的な場合は、new() ですべてのリクエストで使用されるデフォルトのヘッダーを明示的に設定してください。
$browser = new WWW::Mechanize('default_headers' => HTTP::Headers->new('Accept-Encoding'
=> scalar HTTP::Message::decodable()));