Bugzilla用Mechanizeスクリプトの更新

Bugzilla が3系になったのに伴い、WWW::Mechanize で Bugzilla にアクセスして検索結果の数を取得していたスクリプトを修正していたところ、いろんなとこにちょっとずつはまって、思いのほか時間がかかりました。。

まずひとつは、バグジラの設定。

User Agent (ブラウザ)が Accept-language を明示していない場合、バグジラの「パラメータ」の「Localization」の「defaultlanguage」に設定してある言語によってページが表示されます。しかしここに、「languages」と同様に「ja,en」と複数指定しまっているとバグジラがエラーになります。デフォルトなんだから、ひとつでいいよね、という話。
Accept-language を持たない Mechanize でアクセスしたことで初めて発覚した設定ミス。

次に、文字コード関連。

3系になってバグジラは全体的にUTF8になったわけですが、このページを Mechanize (ないしはLWP)で取得した場合、そのコンテンツはUTF8だけどUTF8フラグが立たないようで、以下のように明示的にUTF8フラグをONにすると日本語による正規表現の文字マッチもできるようになりました。

utf8::decode($mech->content)

さらにもうひとつ、一部のリクエストに対するレスポンスの結果が「500 Line too long (limit is 4096)」となってしまいました。調べたところ、レスポンスのヘッダに長すぎるものがあるようで、以下のようにすれば回避できました。

my $mech = WWW::Mechanize->new();
{
    no warnings 'once';
    push(@LWP::Protocol::http::EXTRA_SOCK_OPTS, MaxLineLength => 16*1024);
}

参考: LWP::UserAgent で長いヘッダを受け取る方法