2016-12-25 65 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

相關問題