FetchEnclosure.pmの改修

スポンサーリンク
スポンサーリンク
スポンサーリンク

Plaggerネタです

相も変わらず未だにPlagger使っています。

さて今回のお題通りPlaggerモジュールの一つFetchEnclosure.pmのちょっとした変更です。

このモジュールその名の通りエンクロージャーに指定されたインターネット上のデータをファイルを保存するモジュールです。

その昔インターネット技術がまだ発展途上の事もあり問題視されていなかった事が昨今の技術進歩によって浮彫となりました。(当時っていつの話だよ・・・)

その中の一つ。インターネット転送容量をいかに少なく転送するかという研究がなされ、http(s)通信において通信圧縮技術(以下gzip圧縮)が導入されました。

perlのモジュールは常に進化を遂げてきましたが、Plagger周辺はいまだに未対応でした。

そこで今回少しだけ変更を加えさせていただいてgzip圧縮解除処理を行いたいと思います。

変更点

インストールパスはそのシステム毎に違いますので読み変えて変更をお願いします。

sudo vi /usr/local/share/perl/5.24.1/Plagger/Plugin/Filter/FetchEnclosure.pm

これよりファイルの変更点を示します。私のはかなり弄ってあるので行番号がもう定かではありません。まず

$ua->mirror($request, $path);

となっているところを検索してください。この行を以下のように追記変更します。

        $ua->add_handler(
            response_header => sub {
                my($response, $ua, $handler) = @_;
                $response->{default_add_content} = 1;
            }
        );
#        $ua->default_header('accept-encoding' => 'gzip,x-gzip,deflate');
        my $res = $ua->mirror($request, $path);
        if ( $res->is_success ) {
            if ( $res->header('Content-Type') eq 'application/x-gzip') {
                $res->header('Content-Encoding' => 'gzip');
            }
            my $decoded_content = $res->decoded_content;
            open (OUT, ">$path") or die "$!";
            print OUT $decoded_content;
            close (OUT);
        }

当初コメントされているところだけ追加したのですがmirrorで変換処理をしてもらったつもりがされていないという現象がありました。そこで上記を追加しました。

やっていることは簡単で、ユーザーエージェントに適切なエンコード指定を設定します。

次にmirrorでフェッチ処理し取り込みが完了したらdecoded_contentで変換をかけてやるだけです。

これでファイル取り込みの際gzip圧縮されたデータは元のデータに変換されているはずです。

結論

Plaggerの時代は終わってると思いますがまだまだ現役で活躍させるべく色々なところを変更していきたいと思います。(miyagawaさん復活してくれないかなぁ)

コメント

タイトルとURLをコピーしました