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

时间:2016-12-25 22:33:04

标签: perl lwp lwp-useragent

在查看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;
    }
}

1 个答案:

答案 0 :(得分:4)

对于混淆感到抱歉,设置了$pua->agent,但LWP :: Parallel :: UserAgent没有使用它。这是a long standing bug in LWP::Parallel::UserAgent

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

您的特定问题出在LWP::Parallel::UserAgent::init_request() starting at line 1506

# 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 :: Parallel添加的。 use_eval没有访问方法。有一个LWP::Parallel::UserAgent::nonblock(),但它只是一个二传手。我不认为这是故意的。

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

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

LWP :: Parallel :: UserAgent正在积极维护,you should send a bug report,也许是补丁。