WWW::Mechanize のバグ - にぽたん研究所

November 07, 2005

このエントリーをはてなブックマークに追加
WWW::Mechanize の古いバージョンで動いていたのが、バージョンを上げてみたらどうやら動かなくなっていることに気付く。
どうもリダイレクトされる URL を get() した後の uri() の値がおかしいようだ。
Apache 側を
NameVirtualHost *:80
<VirtualHost *>
ServerName redirect
RewriteEngine On
RewriteRule ^/.* http://www.google.com/ [R,L]
</VirtualHost>
こんなんしておいて、
use strict;
use WWW::Mechanize;
my $mech = WWW::Mechanize->new;
$mech->get('http://redirect/');
print $mech->uri, "\n"
こんなのを動かすと、version 1.05_04 以前の WWW::Mechanize では http://www.google.com/ が返るのに対し、version 1.06 以降では http://redirect/ が返る。
当然、以前書いたコードなので、ここでは http://www.google.com/ が返るのを意図しているので、下位互換性が失われた故に動作していなかったというわけです。
んで、これ、見る限り、どうもこの互換性が失なわれているのは作者の意図っぽくないんですよね…。
該当バージョン間の diff を見る限り、単純に request() の中に書かれていた一部を _update_page() というメソッドに分けただけっぽいんです。
でも、ここで _make_request() を呼ぶタイミングが怪しげで、LWP::UserAgent とかをざっと追ってみたんですが、どうも _update_page() が呼ばれる前に _make_request() の中から呼ばれる SUPER::request() 内部で再帰呼出があって、どうも _update_page() の時点で渡ってくるリクエストが逆順になってるからっぽいです。

ってことで、これを解消する patch を書いてみました。
WWW::Mechanize の version 1.16 用です。

WWW-Mechanize-1.16.patch

一応、作者の Andy Lester さんには patch を送っておきますた。

nipotan at 15:37 | Comments(0) | TrackBack(1) | 技術 
このエントリーをはてなブックマークに追加

Trackback URL for this entry

Trackbacks

森一矢(35)容疑者は、最初容疑を否認していたが、読売新聞の記事によると容疑を大筋認めたようだ。 昨年8月ごろから都内のマンションを拠点にして、森一矢(35)

Post a comment

Name:
URL:
  Remember info?: Rate: Face    Star