2

环境: - Active Perl 5.16 - Windows 2003 Server - 带有 Windows 身份验证的 IIS 6

我试图在 Perl CGI 脚本中使用 Perl 模块“LWP::Simple”,它对服务器上的“管理员”运行良好(使用 Windows 身份验证,IIS/CGI 环境知道用户 Windows 用户名和我们中的一些人) (像我一样)是服务器上的管理员)。但是,对于我们所有其他的非管理员用户,他们得到的是“指定的 CGI 应用程序因未返回完整的 HTTP 标头集而行为不端”。我将其缩小到“使用 LWP::Simple”这一行;如果线路在,非管理员会收到错误;如果线路中断,任何人都不会出错。

由于这是一个“使用”行,在我看来,在 IIS 下调试错误是不可能的(没有像样的错误日志!),所以我分解了 LWP::Simple 模块(它只使用了很多 LWP::UserAgent 东西) 并创建了以下简单脚本来重现潜在错误:

#!perl

use strict;
use warnings;

use CGI::Pretty qw(:standard -any -no_xhtml -oldstyle_urls *center);
use CGI::Carp qw(fatalsToBrowser set_message);
use LWP::UserAgent;

print header;

my $ua = LWP::UserAgent->new;  # we create a global UserAgent object
$ua->env_proxy;
print "<hr>\n";

my $response = $ua->get('http://search.cpan.org/');

if ($response->is_success) {
     print $response->decoded_content;  # or whatever
}
else {
     die $response->status_line;
}

由于错误没有发生在“使用”行中,我们不会得到可怕的 missing-http-headers 错误,而真正的错误会出现在屏幕上:

Access is denied

这使我可以缩小到一行:

$ua->env_proxy;

如果该行在代码中,则非管理员的屏幕上会显示“访问被拒绝”字样(管理员不会收到任何错误)。在这两种情况下,脚本的其余部分都可以正常工作,但是这个错误会阻止 LWP::Simple 工作(错误发生在“使用”行中,并给出了 missing-http-headers 错误)。

虽然我的解决方法是不使用 LWP::Simple 而是使用 LWP::UserAgent(跳过“$ua->env_proxy”部分),但我真的很想知道为什么“$ua->env_proxy”给出“访问被拒绝“对于非管理员

谁能帮我解决这个问题?

4

1 回答 1

0

结束我的这个老问题。

根本问题是对 的系统调用chcp,这是一个仅限管理员使用的 Windows 命令。没有“干净”的解决方案。注释掉该调用的行,或者chcp在您的路径中添加另一个,该行将在内置/仅限管理员版本之前找到。

感谢@ikegami 的富有洞察力的评论至少帮助我弄清楚了“为什么”,即使没有一个干净的修复。

于 2014-06-24T22:22:54.977 回答