为什么在使用 LWP::P arallel::UserAgent 时没有设置 agent()?



在查看UserAgent.pm时似乎未定义。至少,据我所知,当例程到达该部分时,它是未定义的,即使我用$pua->agent()显式设置它。这是一个错误吗?也有init_header(),但是当我尝试$pua->request->init_header()时,它也未能设置。

#!/bin/perl
use LWP::Parallel::UserAgent;
my $ua_string =
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36";
my $url  = "http://www.example1.com";
my $url2 = "http://www.example2.com";
my $reqs = [
HTTP::Request->new( 'GET', $url ),
HTTP::Request->new( 'GET', $url2 )
];
my ( $req, $res );
my $pua = LWP::Parallel::UserAgent->new();
$pua->agent($ua_string);
foreach $req ( @$reqs ) {
$pua->register( $req );
}
my $entries = $pua->wait();
foreach ( keys %$entries ) {
$res = $entries->{$_}->response;
my $r = $res;
my @redirects;
while ( $r ) {
$res = $r;
$r   = $r->previous;
push( @redirects, $res ) if $r;
}
}

很抱歉造成混乱,$pua->agent已设置,但 LWP::P arallel::UserAgent 没有使用它。这是LWP::P arallel::UserAgent中长期存在的错误。

LWP::P arallel::UserAgent 是 LWP::UserAgent 的一个子类,但它是一个行为不佳的子类。它不使用访问器,而是在内部字段抓取并假设代理将存储在$self->{agent}中。也许曾经是,但现在不是了。

您的特定问题在于从第 1506 行开始LWP::Parallel::UserAgent::init_request()

# Extract fields that will be used below
my ($agent, $from, $timeout, $cookie_jar,
$use_eval, $parse_head, $max_size, $nonblock) =
@{$self}{qw(agent from timeout cookie_jar
use_eval parse_head max_size nonblock)};

这假设用户代理存储在$self->{agent}中。其实不然。相反,它应该执行类似操作来依次调用每个访问器。

my %fields;
my @fields = qw(agent from timeout cookie_jar parse_head max_size);
for my $field (@fields) {
$fields{$field} = $self->$field();
}

或者直接使用访问器。这将使用 LWP 的文档接口。

nonblockuse_eval是特例。这些不是 LWP::UserAgent 字段,它们是由 LWP::P arallel 添加的。没有用于use_eval的访问器方法。有LWP::Parallel::UserAgent::nonblock(),但它只是一个二传手。我不认为这是故意的。

因为它没有为use_eval定义一个访问器,所以应该添加一个。您可以修复nonblock以始终返回其值。

sub nonblock {
my $self = shift;
$self->{'nonblock'} = $_[0] if defined $_[0];
return $self->{nonblock};
}

LWP::P arallel::UserAgent正在积极维护,您应该发送错误报告,也许还有一个补丁。

最新更新