November 07, 2005
WWW::Mechanize の古いバージョンで動いていたのが、バージョンを上げてみたらどうやら動かなくなっていることに気付く。
どうもリダイレクトされる URL を
Apache 側を
当然、以前書いたコードなので、ここでは http://www.google.com/ が返るのを意図しているので、下位互換性が失われた故に動作していなかったというわけです。
んで、これ、見る限り、どうもこの互換性が失なわれているのは作者の意図っぽくないんですよね…。
該当バージョン間の diff を見る限り、単純に
でも、ここで
ってことで、これを解消する patch を書いてみました。
WWW::Mechanize の version 1.16 用です。
WWW-Mechanize-1.16.patch
一応、作者の Andy Lester さんには patch を送っておきますた。
どうもリダイレクトされる 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 を送っておきますた。