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

もしあなたが 'print 'を貼っていたら、ユーザエージェントは:' $ pua-> agent'あなたが設定した直後に何を得ますか? – Schwern

答えて

5

$pua->agentが設定されますが、LWP ::パラレルれる:: 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のための文書化されたインタフェースを使用します。

nonblockおよびuse_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

関連する問題