【问题标题】:How to test an HTTP header value using LWP::UserAgent如何使用 LWP::UserAgent 测试 HTTP 标头值
【发布时间】:2013-03-08 07:01:40
【问题描述】:

当我得到答案时,我可能会发布更多问题,但是就这样吧!

我目前正在尝试对我的大学用来自动下载包含 SAT 分数数据的文件的 Perl 脚本进行故障排除。

这个想法是阅读某个帐户中的电子邮件;拉出循环编号(在 URL 中使用);拼凑多个网址;然后使用LWP::UserAgent 从服务器获取文件并对它们执行其他 Perl 魔法。

在我的调查中,我确定手动输入 URL(从而限制用户运行的脚本,每次都替换循环编号)确实有效。

在检查发回的响应对象时,我注意到(首先)失败的请求中缺少以下行:

'_uri_canonical' => $VAR1->{'_request'}{'_uri'}

但是它存在于成功的请求中。

如果你们中的任何人能告诉我为什么在不成功的请求中缺少这一行,我会感谢你们,但这不是我要问的。

我的问题与进一步调查有关,以了解它被拒绝的原因。

LWP::UserAgent 的文档中,我注意到了这一点:

LWP 内部生成的错误响应会将“Client-Warning”标头设置为值“Internal response”。如果您需要将这些内部响应与远程服务器实际生成的响应区分开来,则需要测试此标头值。

我的问题:您如何实际测试该标头值? (请原谅我的无知;我是我大学 IT 部门的实习生)

【问题讨论】:

  • 我误会了什么?我确定您知道'_uri_canonical' => $VAR1->{'_request'}{'_uri'} 不是标题字段。它看起来像 Data::Dumper 的输出,用于调试程序中的某些内容。我需要了解您的意图并查看更多不适合您的 Perl 代码。
  • _uri_canonical 的缺失仅仅意味着没有人在该特定请求上调用uri_canonical 方法,这可能与不成功请求的情况有关。不工作的脚本可能正在发出该调用,或者它可能类似于HTTP::Config(因为有人说$ua->add_handler 而发生这种情况)。如果没有更多的上下文,真的很难判断。
  • 感谢您的澄清。正如您所怀疑的,这实际上是 Data::Dumper 的输出。这是给我的代码:code foreach my $msgnum (sort keys %cycles) { my $url = $site.$cycles{$msgnum}{cycle};我的 $response = $browser->get($url);我的 $gpg = $response->内容;报告($cycles{$msgnum}{cycle}, $url, $gpg, Dumper($response)); (如果格式不正确,我深表歉意。)我上面提到的 uri_canonical 位来自传递给 Report() sr 的最后一个参数。 $browser 是一个基本的 LWP::UserAgent。

标签: perl httpresponse lwp-useragent


【解决方案1】:

它实际上在该标头中放置了各种消息,您可以通过以下方式获取:

if (my $cw = $response->header('Client-Warning')) {
   die("Internal error: $cw\n");
}

Internal response 消息仅在状态已指示错误时使用。其他消息,例如Redirect loop detectedMissing Authenticate header,在其他时间使用。上面的代码将获取那里存在的任何消息,而不仅仅是检查Internal response

【讨论】:

  • 请解释一下你的想法。您是说响应中有一个Client-Warning 标头可以包含多条消息吗?这与问题有何关系?
  • 使用产生 $cw = "内部响应"。想法?
  • 就像我说的,这意味着你得到的 status_line 是由 LWP::UA 自己生成的。状态行中指定了什么错误?
  • code 500 无法连接到 ets-scorelink.ets.org:443(SSL 连接尝试失败,出现未知错误错误:00000000:lib(0):func(0):reason( 0)) 那是你要找的吗?这是我好奇的另一件事。
【解决方案2】:

使用LWP 的标准方式类似于

use strict;
use warnings;

use LWP;

my $ua = LWP::UserAgent->new;

my $resp = $ua->get('http://my.domain.co.uk/');

die $resp->status_line unless $resp->is_success;

my $content = $resp->decoded_content;

你需要知道什么?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-02
    • 2012-01-02
    • 1970-01-01
    • 2011-09-24
    • 2023-03-04
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多