2016-12-25 5 views
1

Es scheint bei UserAgent.pm undefiniert zu sein. Zumindest, soweit ich weiß, ist es undefiniert, wenn die Routine zu diesem Teil kommt, obwohl ich es explizit mit $pua->agent() setze. Ist das ein Fehler? Es gibt auch init_header(), aber als ich versuchte $pua->request->init_header(), es auch nicht gesetzt.Warum wird agent() nicht gesetzt, wenn LWP :: Parallel :: UserAgent verwendet wird?

#!/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

Dieser Code funktioniert gut. Können Sie die Fehlermeldung, die Sie erhalten haben, posten? Auch, welche Versionen von LWP und LWP :: Parallel :: UserAgent Sie verwenden. – Schwern

+0

Neueste Version. Es legt die User-Agent-Zeichenfolge für mich nicht fest. Es läuft gut, aber setzt den Wert nicht. –

+0

Wenn Sie einen 'print'-Button anheften Der User-Agent ist:". $ Pua-> agent "gleich nachdem Sie es gesetzt haben, bekommen Sie was? – Schwern

Antwort

5

Sorry über die Verwirrung wird $pua->agent gesetzt, aber LWP :: Parallel :: Useragent wird es nicht verwenden. Dies ist a long standing bug in LWP::Parallel::UserAgent.

LWP :: Parallel :: UserAgent ist eine Unterklasse von LWP :: UserAgent, aber es ist eine schlecht benommene Unterklasse. Anstatt Accessoren zu verwenden, greift es auf interne Felder und nimmt an, dass der Agent in $self->{agent} gespeichert wird. Vielleicht war es einmal, aber es ist nicht mehr.

Ihr spezielles Problem ist in 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)}; 

Dies setzt voraus, dass der Benutzeragent in $self->{agent} gespeichert ist. Es ist nicht. Es sollte stattdessen so etwas tun, um jeden Accessor der Reihe nach aufzurufen.

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

Oder verwenden Sie einfach die Accessoren direkt. Dies wird die dokumentierte Schnittstelle für LWP verwenden.

nonblock und use_eval sind Sonderfälle. Dies sind keine LWP :: UserAgent Felder, sie wurden von LWP :: Parallel hinzugefügt. Es gibt keine Zugriffsmethode für use_eval. Es gibt eine LWP::Parallel::UserAgent::nonblock() aber es ist nur ein Setter. Ich denke nicht, dass dies beabsichtigt ist.

Da es keinen Accessor für use_eval definiert, und sollte einen hinzufügen. Und Sie könnten nonblock beheben, um immer seinen Wert zurückzugeben.

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

LWP :: Parallel :: Useragent aktiv gepflegt wird, you should send a bug report und vielleicht ein Patch.

+0

Ich bekomme libwww-perl/6.13, wenn ich die Zeile hinzufüge. Es sollte auch in meinen Apache-Logs erscheinen. Es ist nicht, es ist nur ein "-". Ich habe LWP :: Parallel :: UserAgent von der Quelle installiert, es wird nicht geändert. Es wird die agent() - Zeichenfolge nicht aufnehmen. –

+0

Ich habe libwww-6.15 und ParallelUserAgent-2.62 von der Quelle installiert, und es gibt keine Änderung. $ pua-> agent() wird nicht gesendet, wenn eine Verbindung hergestellt wird.Es wird im Programm eingestellt, aber nicht zur Verbindungszeit gesendet. –

+0

Sie zeigen uns nicht den richtigen Code, Sie haben wahrscheinlich einen Tippfehler. Aktivieren Sie strict und Warnungen, beheben Sie alle Probleme und sehen Sie, was passiert. – Schwern

Verwandte Themen