LWP :: UserAgent的env_proxy为非管理员用户提供“拒绝访问”

时间:2013-11-04 16:31:20

标签: perl cgi lwp-useragent

环境: - 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完全工作(错误发生在“use”行中并且给出了丢失的http-headers错误。)

虽然我的解决方法是不使用LWP :: Simple而是使用LWP :: UserAgent(跳过“$ ua&gt; env_proxy”部分),我真的想知道为什么“$ ua-&gt ; env_proxy“give”拒绝访问“非管理员

任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

解决我的这个老问题。

底层问题是对chcp的系统调用,这是一个仅限管理员的Windows命令。没有&#34;清洁&#34;解。要么注释该调用的行,要么在您的路径中添加另一个chcp,该内容将在内置/仅限管理员版本之前找到。

感谢@ikegami的深刻见解,至少帮助我找出了&#34;为什么&#34;,即使没有一个干净的解决方案。