3

我有一个 perl CGI 应用程序,我想获取用户请求标头,并将其转换为 LWP::UserAgent 获取请求。基本上,目标是复制传入的用户标头并使用这些标头发出单独的请求。

我尝试自己创建标头,但是当我尝试显示 CGI 标头然后我的克隆 UserAgent 标头时,它们并不完全相同。这是我得到的:

我的 $cgi = 新的 CGI;
我的 %headers = 地图 { $_ => $cgi->http($_) } $cgi->http;
我的 $req_headers = HTTP::Headers->new( %headers );
我的 $ua = LWP::UserAgent->new( default_headers => $req_headers );
打印自卸车 $ua->default_headers;

基本上, %headers 和 $ua->default_headers 并不相同。$ua->default_headers 有一个将自己标识为 perl 脚本的代理。我可以手动设置 $ua->agent("") 但还有其他缺陷,并且标题仍然不相同。

做我想做的最好的方法是什么?必须有一个更简单的解决方案...

4

1 回答 1

3

与 HTTP::Headers 使用的相比,问题似乎与传入 http 标头的命名有关。

传入的参数都有HTTP_前缀,其中 HTTP::Headers 不使用该命名约定(这是有道理的)。另外,看起来(快速阅读代码)HTTP::Headers 在将 '-' 转换为 '_' 以供自己使用时做了正确的事情。

我建议将您更改map为以下以删除前缀:

# remove leading HTTP_ from keys, note: this assumes all keys have pattern
# HTTP_*
%headers = map { ( /^HTTP_(.*?)$/ ) => $cgi->http($_) } $cgi->http;

这是我使用的调试脚本:

my $cgi = CGI->new;
my %headers = map { $_ => $cgi->http($_) } $cgi->http;
my $req_headers = HTTP::Headers->new( %headers );
my $ua = LWP::UserAgent->new( default_headers => $req_headers );

print "Content-type: text/plain\n\n";
print Dumper($ua->default_headers);
print Dumper( \%headers );

# remove HTTP_ from $_
%headers = map { ( /^HTTP_(.*?)$/ ) => $cgi->http($_) } $cgi->http;
$req_headers = HTTP::Headers->new( %headers );
$ua = LWP::UserAgent->new( default_headers => $req_headers );

print "headers part deux:\n";
print Dumper( $ua );

希望有帮助

于 2011-06-16T15:38:34.130 回答