2016-12-25 89 views
1

看着UserAgent.pm似乎是不确定的。至少,据我所知,当例程到达该部分时,它是不确定的,尽管我明确地将其设置为$pua->agent()。这是一个错误?还有init_header(),但是当我尝试$pua->request->init_header()时,它也未能设置。使用LWP :: Parallel :: UserAgent时,为什么不设置agent()?

#!/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; 
    } 
} 
+0

该代码正常工作。你能发布你收到的错误信息吗?还有你正在使用的LWP和LWP :: Parallel :: UserAgent的版本。 – Schwern

+0

最新版本。它不为我设置User-Agent字符串。它运行良好,但没有设置值。 –

+0

如果你坚持'打印'用户代理是:“。$ pua-> agent'在你设置它后立即得到什么? – Schwern

回答

5

对此感到困惑,$pua->agent已设置,但LWP :: Parallel :: UserAgent未使用它。这是a long standing bug in LWP::Parallel::UserAgent

LWP ::并行:: UserAgent的是LWP ::用户代理的子类,但它是一个运行欠佳的子类。而不是使用访问器,它会在内部域中获取并假设代理将存储在$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,并应增加一个。并且您可以修复nonblock以始终返回其值。

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

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

+0

当我添加该行时,我得到libwww-perl/6.13。它也应该显示在我的apache日志中。它不,它只是一个“ - ”。我从源码安装了LWP :: Parallel :: UserAgent,它没有被修改。它不会拿起agent()字符串。 –

+0

我从源码安装了libwww-perl-6.15和ParallelUserAgent-2.62,没有任何变化。当进行连接时,不会发送$ pua-> agent()。它在程序中设置,但不在连接时发送。 –

+0

你没有向我们展示真实的代码,你可能有一个错字。打开严格和警告,解决所有问题,然后看看会发生什么。 – Schwern

相关问题