WWW::Mechanize がどんなリクエストを送っているのか、をログに出力してデバッグに使いたいという話。
Class::Method::Modifiers を使って、LWP::UserAgent::send_request を hook してあげるとうまくいった。(WWW::Mechanize は LWP::UserAgent の子クラス)
use strict; use WWW::Mechanize; use Class::Method::Modifiers; use Data::Dumper; use utf8; $Data::Dumper::Indent = 1; before "LWP::UserAgent::send_request" => sub { print Dumper $_[1]; }; my $mech = WWW::Mechanize->new; $mech->get("http://d.hatena.ne.jp/sfujiwara/"); $mech->follow_link( text_regex => qr/記事一覧/ );
実行結果
$VAR1 = bless( { '_content' => '', '_uri' => bless( do{\(my $o = 'http://d.hatena.ne.jp/sfujiwara/')}, 'URI::http' ), '_headers' => bless( { 'user-agent' => 'WWW-Mechanize/1.68', 'accept-encoding' => 'gzip' }, 'HTTP::Headers' ), '_method' => 'GET', '_uri_canonical' => $VAR1->{'_uri'} }, 'HTTP::Request' ); $VAR1 = bless( { '_content' => '', '_uri' => bless( do{\(my $o = 'http://d.hatena.ne.jp/sfujiwara/archive')}, 'URI::http' ), '_headers' => bless( { 'cookie2' => '$Version="1"', 'user-agent' => 'WWW-Mechanize/1.68', 'cookie' => 'b=$1$sYSZ0Uab$aQH2JllGPhieYdpLtYKo81', 'accept-encoding' => 'gzip', 'referer' => 'http://d.hatena.ne.jp/sfujiwara/' }, 'HTTP::Headers' ), '_method' => 'GET', '_uri_canonical' => $VAR1->{'_uri'} }, 'HTTP::Request' );
[追記]
tomi-ru LWP::UserAgentそのものにもhookポイントついていたような。
というブクマコメントをいただいたので、perldoc をよく読んだらありました。add_handler で hook を追加することができます。
$mech->add_handler( request_send => sub { my ($request, $ua, $h) = @_; print Dumper $request; return; # HTTP::Response を返すか、return; する必要がある } );
これで、Class::Method::Modifiers を使ったのと同様の動作をします。