2016-12-25 22 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에 대해 문서화 된 인터페이스가 사용됩니다.

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을 얻습니다. 그것은 또한 내 아파치 로그에 표시되어야합니다. 그것은 단지 "-"일뿐입니다. 내가 소스에서 LWP :: Parallel :: UserAgent를 설치했지만 수정되지 않았습니다. agent() 문자열을 선택하지 않습니다. –

+0

소스에서 libwww-perl-6.15 및 ParallelUserAgent-2.62를 설치 했으므로 아무런 변화가 없습니다. $ pua-> agent()는 연결이 설정되면 전송되지 않습니다.프로그램에 설정되었지만 연결 시간에는 전송되지 않습니다. –

+0

실제 코드가 표시되지 않을 수 있습니다. 오타가있을 수 있습니다. 엄격한 경고를 켜고 모든 문제를 해결 한 다음 어떤 일이 발생하는지 확인하십시오. – Schwern