【问题标题】:Why isn't agent() set when using LWP::Parallel::UserAgent?为什么使用 LWP::Parallel::UserAgent 时没有设置 agent()?
【发布时间】:2016-12-25 22:33:03
【问题描述】:

查看UserAgent.pm 时似乎未定义。至少,据我所知,当例程到达该部分时,它是未定义的,即使我使用$pua->agent() 明确设置它。这是一个错误吗?还有init_header(),但是我尝试$pua->request->init_header()的时候也设置失败。

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

【问题讨论】:

  • 该代码运行良好。你能发布你收到的错误消息吗?还有你使用的是什么版本的 LWP 和 LWP::Parallel::UserAgent。
  • 最新版本。它没有为我设置用户代理字符串。它运行良好,但没有设置值。
  • 如果您在设置后立即粘贴print "The user-agent is: ".$pua->agent,您会得到什么?
  • 我正在查看我的日志文件。它不在我的日志文件中。如果我进入并手动编辑 perl 模块 UserAgent.pm 并在那里设置代理变量,它就可以工作,并显示在我的日志中。但在使用 $pua->agent() 时不会。
  • 当你说“它不在我的日志文件中”时,你的意思是你得到了The user-agent is: 或者你什么也没得到?如果您一无所获,那么该行根本就不会运行。同样,因为您没有使用strictwarnings,我怀疑真正发生的事情是您有错字并且您正在传递undef。尝试打印$ua_string。同时打开严格和警告。或者您正在使用某人的破解版本的 LWP::UserAgent(因为您很可能正在编辑该模块)。尝试将其与新下载的内容进行比较。

标签: perl lwp lwp-useragent


【解决方案1】:

抱歉,$pua->agent 已设置,但 LWP::Parallel::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::Parallel::UserAgent 正在积极维护中,you should send a bug report 可能还有补丁。

【讨论】:

  • 当我添加该行时,我得到了 libwww-perl/6.13。它也应该出现在我的 apache 日志中。它没有,它只是一个“-”。我已经从源代码安装了 LWP::Parallel::UserAgent,它没有被修改。它不会获取 agent() 字符串。
  • 我从源头安装了libwww-perl-6.15和ParallelUserAgent-2.62,没有任何变化。建立连接时不发送 $pua->agent()。在程序中设置,但在连接时不发送。
  • 你没有向我们展示真正的代码,你可能有一个错字。打开严格和警告,修复所有问题,然后看看会发生什么。
  • 这就是整个程序。我正在运行我发布的内容。
  • @LukasNelson %fields 你发现控制访问器的自动生成。它可能“有效”,但恐怕您正在覆盖现有的LWP::UserAgent::agent() 访问器以及它存储数据的位置。这可能会导致其他微妙的错误。真正的解决方法是更改​​ LWP::Parallel::UserAgent 以不对 LWP::UserAgent 对象的内部进行假设。
猜你喜欢
  • 2011-09-24
  • 2019-01-20
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多