Thursday, June 18, 2009

Perl: дебаг LWP::UserAgent и семейства

Довольно часто при использовании LWP (LWP::Useragent, WWW::Mechanize, etc.) возникает необходимость просмотра/анализа HTTP-заголовков. Для firefox есть плагин - Live HTTP Headers. А в этой заметке я расскажу, как получить нечто подобное в Perl.

Cредствами самого LWP::UserAgent, печатать HTTP-заголовки можно так:

use LWP::UserAgent;
my $ua = LWP::UserAgent->new();

$ua->add_handler(
"request_send",
sub {
my $r = shift;
print "==>n", $r->as_string;
return;
},
);
$ua->add_handler(
"response_done",
sub {
my $r = shift;
print "<==n", $r->status_line, "n", $r->headers->as_string, "n";
},
);

$ua->get("http://google.com");


В результате получаем:
==>
GET http://google.com
User-Agent: libwww-perl/5.834

<==
301 Moved Permanently
Cache-Control: public, max-age=2592000
Connection: close
Date: Wed, 29 Sep 2010 20:11:29 GMT
Location: http://www.google.com/
Server: gws
Content-Length: 219
Content-Type: text/html; charset=UTF-8
Expires: Fri, 29 Oct 2010 20:11:29 GMT
Client-Date: Wed, 29 Sep 2010 20:11:29 GMT
Client-Peer: 74.125.232.20:80
Client-Response-Num: 1
Title: 301 Moved
X-XSS-Protection: 1; mode=block

==>
GET http://www.google.com/
User-Agent: libwww-perl/5.834
...



Для разнообразия, еще один способ с использованием модуля Aspect:

use Aspect;

my $pointcut = call 'LWP::UserAgent::send_request';

before {
print "==>n", shift->params->[1]->as_string;
} $pointcut;

after {
my $resp = shift->return_value;
print "<==n", $resp->status_line, "n", $resp->headers->as_string, "n";
} $pointcut;

my $ua = LWP::UserAgent->new();
$ua->get("http://google.com");


В результате печатается то же самое.

No comments:

Post a Comment